소프트웨어 보안은 보안 소프트웨어가 아닙니다. 여기서는 인증, 액세스 제어, 기밀성, 암호화, 권한 관리 등의 항목에 대해 설명합니다.
...
HttpRequest req = new HttpRequest();
req.setEndpoint('http://example.com');
HTTPResponse res = new Http().send(req);
...
HttpResponse
개체인 res
는 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
var account = new CloudStorageAccount(storageCredentials, false);
...
String url = 'http://10.0.2.2:11005/v1/key';
Response response = await get(url, headers: headers);
...
response
는 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
helloHandler := func(w http.ResponseWriter, req *http.Request) {
io.WriteString(w, "Hello, world!\n")
}
http.HandleFunc("/hello", helloHandler)
log.Fatal(http.ListenAndServe(":8080", nil))
URL url = new URL("http://www.android.com/");
HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {
InputStream in = new BufferedInputStream(urlConnection.getInputStream());
readStream(in);
...
}
instream
은 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
var http = require('http');
...
http.request(options, function(res){
...
});
...
http.IncomingMessage
개체인 res
는 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
NSString * const USER_URL = @"http://localhost:8080/igoat/user";
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:USER_URL]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];
...
stream_socket_enable_crypto($fp, false);
...
require 'net/http'
conn = Net::HTTP.new(URI("http://www.website.com/"))
in = conn.get('/index.html')
...
in
은 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
val url = Uri.from(scheme = "http", host = "192.0.2.16", port = 80, path = "/")
val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = url))
responseFuture
는 암호화 및 인증되지 않는 채널을 통해 제공되기 때문에 침해가 발생할 수 있습니다.
let USER_URL = "http://localhost:8080/igoat/user"
let request : NSMutableURLRequest = NSMutableURLRequest(URL:NSURL(string:USER_URL))
let conn : NSURLConnection = NSURLConnection(request:request, delegate:self)
Config.PreferServerCipherSuites
필드는 서버가 클라이언트 또는 서버의 암호 집합 기본 설정을 따르는지 여부를 제어합니다. 선택한 암호 집합에 알려진 취약성이 있는 경우, 클라이언트의 기본 암호 집합을 사용하면 보안 취약성이 발생할 수 있습니다.PreferServerCipherSuites
필드를 false
로 설정합니다.
conf := &tls.Config{
PreferServerCipherSuites: false,
}
client = SSHClient()
algorithms_to_disable = { "ciphers": untrusted_user_input }
client.connect(host, port, "user", "password", disabled_algorithms=algorithms_to_disable)
SSHClient.connect(...)
가 상대적으로 약한 알고리즘인 3DES-CBC를 사용하도록 강제할 수 있습니다.
...
Using(SqlConnection DBconn = new SqlConnection("Data Source=210.10.20.10,1433; Initial Catalog=myDataBase;User ID=myUsername;Password=myPassword;"))
{
...
}
...
...
insecure_config = {
'user': username,
'password': retrievedPassword,
'host': databaseHost,
'port': "3306",
'ssl_disabled': True
}
mysql.connector.connect(**insecure_config)
...
NSURLSession
, NSURLConnection
또는 CFURL
을 사용하는 경우 기본적으로 활성화되어 응용 프로그램과 백엔드 서버와의 모든 네트워크 통신에 HTTPS
와 TLS 1.2
를 사용할 것을 강제합니다.Info.plist
의 다음 항목은 ATS(App Transport Security)를 완전히 비활성화합니다.예제 2: 응용 프로그램
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Info.plist
의 다음 항목은 yourserver.com
에 대해 ATS(App Transport Security)를 비활성화합니다.
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Allow plain HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Downgrades TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
<a href="http://www.example.com/index.html"/>
www.example.com
을 모방하거나 조작하여 자신의 웹 페이지를 로드할 수 있습니다.
...
using var channel = GrpcChannel.ForAddress("https://grpcserver.com", new GrpcChannelOptions {
Credentials = ChannelCredentials.Insecure
});
...
...
ManagedChannel channel = Grpc.newChannelBuilder("hostname", InsecureChannelCredentials.create()).build();
...
None
으로 설정됩니다. 이처럼 안전하지 않은 채널 자격 증명 설정을 사용하여 주고받는 데이터는 신뢰할 수 없습니다.root_certificates
매개 변수의 값은 None
으로, private_key
매개 변수의 값은 None
으로, certificate_chain
매개 변수의 값은 None
으로 설정됩니다.
...
channel_creds = grpc.ssl_channel_credentials()
...
...
Server server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
...
None
또는 False
로 설정됩니다. 이처럼 안전하지 않은 서버 자격 증명 설정을 사용하는 서버와 주고받는 데이터는 신뢰할 수 없습니다.
...
pk_cert_chain = your_organization.securelyGetPrivateKeyCertificateChainPairs()
server_creds = grpc.ssl_server_credentials(pk_cert_chain)
...
HSTS
(HTTP Strict Transport Security) 헤더를 설정하지만 이 보호 기능을 하위 도메인에 적용하지 못해 공격자가 HTTPS 스트리핑 공격을 통해 하위 도메인 연결에서 민감한 정보를 훔칠 수 있습니다.HSTS
(HTTP Strict Transport Security)는 브라우저가 항상 HSTS 헤더를 헤더 내에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.
<http auto-config="true">
...
<headers>
...
<hsts include-sub-domains="false" />
</headers>
</http>
HSTS
) 헤더를 설정하지만 이 보호 기능을 하위 도메인에 적용하지 못해 공격자가 HTTPS 스트리핑 공격을 통해 하위 도메인 연결에서 민감한 정보를 훔칠 수 있습니다.HSTS
)는 브라우저가 항상 HSTS 헤더를 헤더 자체에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.HSTS
(HTTP Strict Transport Security) 헤더를 설정하지 않습니다. 이로 인해 공격자가 HTTPS 스트리핑 공격을 통해 SSL/TLS 연결을 일반 HTTP 연결로 바꾸고 민감한 정보를 훔칠 수 있습니다.HSTS
(HTTP Strict Transport Security)는 브라우저가 항상 HSTS 헤더를 헤더 내에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.
<http auto-config="true">
...
<headers>
...
<hsts disabled="true" />
</headers>
</http>
HSTS
(HTTP Strict Transport Security) 헤더를 설정하지 않습니다. 이를 통해 공격자는 SSL/TLS 연결을 일반 HTTP 연결로 교체하고 HTTPS 스트리핑 공격을 수행하여 민감한 정보를 훔칠 수 있습니다.HSTS
)는 브라우저가 항상 HSTS 헤더를 헤더 자체에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.HSTS
) 헤더를 설정하지 않아 공격자가 HTTPS 스트리핑 공격을 수행하여 SSL/TLS 연결을 일반 HTTP 연결로 바꾸고 민감한 정보를 훔칠 수 있습니다.HSTS
)는 브라우저가 항상 HSTS 헤더를 헤더 자체에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.modp2
그룹을 사용하여 Diffie-Hellman 키 교환 프로토콜(1024비트 소수를 사용함)을 초기화합니다.
const dh = getDiffieHellman('modp2');
dh.generateKeys();
...
HSTS
(HTTP Strict Transport Security) 헤더를 부족한 만료 시간으로 설정합니다. 이로 인해 공격자가 HTTPS 스트리핑 공격을 수행하여 HTTPS 연결을 일반 HTTP 연결로 바꾸고 민감한 정보를 훔칠 수 있습니다.HSTS
(HTTP Strict Transport Security)는 브라우저가 항상 HSTS 헤더를 헤더 내에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
...
http.headers(headers ->
headers.httpStrictTransportSecurity(hstsConfig ->
hstsConfig.maxAgeInSeconds(300)
)
);
...
}
HSTS
) 헤더를 부족한 만료 시간으로 설정하여 공격자가 HTTPS 스트리핑 공격을 통해 HTTPS 연결을 일반 HTTP 연결로 바꾸고 민감한 정보를 훔칠 수 있습니다.HSTS
)는 브라우저가 항상 HSTS 헤더를 헤더 자체에 지정된 기간 동안 SSL/TLS를 통해 반환하는 사이트에 연결하도록 지시하는 보안 헤더입니다. HTTP를 통해 서버로 전송되는 모든 연결은 사용자가 브라우저의 URL 표시줄에 http://
를 입력하더라도 HTTPS 연결로 자동으로 바뀝니다.SmtpClient
는 SMTP 서버와 통신할 때 SSL/TLS를 사용하지 않도록 올바르지 않게 구성되어 있습니다.
string to = "bob@acme.com";
string from = "alice@acme.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "SMTP client.";
message.Body = @"응용 프로그램에서 매우 쉽게 전자 메일을 전송할 수 있습니다.";
SmtpClient client = new SmtpClient("smtp.acme.com");
client.UseDefaultCredentials = true;
client.Send(message);
<bean id="mailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
<property name="host" value="smtp.acme.com" />
<property name="port" value="25" />
<property name="javaMailProperties">
<props>
<prop key="mail.smtp.auth">true</prop>
</props>
</property>
</bean>
session = smtplib.SMTP(smtp_server, smtp_port)
session.ehlo()
session.login(username, password)
session.sendmail(frm, to, content)
device.createInsecureRfcommSocketToServiceRecord(MY_UUID);
...
var options = {
port: 443,
path: '/',
key : fs.readFileSync('my-server-key.pem'),
cert : fs.readFileSync('server-cert.pem'),
...
}
https.createServer(options);
...
secureProtocol
의 기본값을 SSLv23_method
로 설정하므로 서버는 secureProtocol
이 특별히 오버라이드되지 않으면 본질적으로 안전하지 않습니다.
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration ephemeralSessionConfiguration];
[configuration setTLSMinimumSupportedProtocol = kSSLProtocol3];
NSURLSession *mySession = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:operationQueue];
let configuration : NSURLSessionConfiguration = NSURLSessionConfiguration.defaultSessionConfiguration()
let mySession = NSURLSession(configuration: configuration, delegate: self, delegateQueue: operationQueue)