La seguridad de un software no es un software de seguridad. Nos preocupamos de cuestiones como la autenticación, el control de acceso, la confidencialidad, la criptografía y la gestión de privilegios.
URL url = new URL("https://myserver.org");
URLConnection urlConnection = url.openConnection();
InputStream in = urlConnection.getInputStream();
SSLSocketFactory
subyacente usado por la URLConnection
, se usará el valor predeterminado que confiará en todas las entidades de certificación presentes en el almacén de claves de Android predeterminado.
val url = URL("https://myserver.org")
val data = url.readBytes()
SSLSocketFactory
subyacente usado por la URLConnection
, se usará el valor predeterminado que confiará en todas las entidades de certificación presentes en el almacén de claves de Android predeterminado.
NSString* requestString = @"https://myserver.org";
NSURL* requestUrl = [NSURL URLWithString:requestString];
NSURLRequest* request = [NSURLRequest requestWithURL:requestUrl
cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
timeoutInterval:10.0f];
NSURLConnection* connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
NSURLConnectionDelegate
definidos para gestionar la comprobación de certificados, se usarán los del sistema que confían en todas las entidades de certificación presentes en el almacén de claves predeterminado de iOS.
let requestString = NSURL(string: "https://myserver.org")
let requestUrl : NSURL = NSURL(string:requestString)!;
let request : NSURLRequest = NSURLRequest(URL:requestUrl);
let connection : NSURLConnection = NSURLConnection(request:request, delegate:self)!;
NSURLConnectionDelegate
definidos para gestionar la comprobación de certificados, se usarán los del sistema que confían en todas las entidades de certificación presentes en el almacén de claves predeterminado de iOS.
...
private bool CertificateCheck(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
...
return true;
}
...
HttpWebRequest webRequest = (HttpWebRequest) WebRequest.Create("https://www.myTrustedSite.com");
webRequest.ServerCertificateValidationCallback = CertificateCheck;
WebResponse response = webRequest.GetResponse();
...
...
SSL_CTX_set_verify(ctx, SSL_VERIFY_NONE, verify_callback);
...
...
config := &tls.Config{
// Set InsecureSkipVerify to skip the default validation
InsecureSkipVerify: true,
...
}
conn, err := tls.Dial("tcp", "example.com:443", conf)
..
...
Email email = new SimpleEmail();
email.setHostName("smtp.servermail.com");
email.setSmtpPort(465);
email.setAuthenticator(new DefaultAuthenticator(username, password));
email.setSSLOnConnect(true);
email.setFrom("user@gmail.com");
email.setSubject("TestMail");
email.setMsg("This is a test mail ... :-)");
email.addTo("foo@bar.com");
email.send();
...
smtp.mailserver.com:465
, esta aplicación aceptaría sin objeciones cualquier certificado emitido a "hackedserver.com
". La aplicación podría filtrar entonces información de usuario confidencial en una conexión SSL interrumpida en el servidor pirateado.
...
var options = {
key : fs.readFileSync('my-server-key.pem'),
cert : fs.readFileSync('server-cert.pem'),
requestCert: true,
...
}
https.createServer(options);
...
https.Server
, el parámetro requestCert
se define como true
, pero no se establece rejectUnauthorized
, lo que establece false
de forma predeterminada. Esto significa que, aunque el servidor se creó con la intención de verificar clientes en SSL, se seguirán aceptando conexiones incluso si el certificado no está autorizado con la lista de entidades de certificación proporcionadas.
var tls = require('tls');
...
tls.connect({
host: 'https://www.hackersite.com',
port: '443',
...
rejectUnauthorized: false,
...
});
rejectUnauthorized
se estableció en el valor false, significa que se aceptarán certificados no autorizados y que de todas formas se creará una conexión segura con el servidor no identificado. La aplicación podría filtrar entonces información de usuario confidencial en una conexión SSL interrumpida en el servidor pirateado.NSURLConnectionDelegate
para que acepte cualquier certificado HTTPS:
implementation NSURLRequest (IgnoreSSL)
+ (BOOL)allowsAnyHTTPSCertificateForHost:(NSString *)host
{
return YES;
}
@end
NSURLRequest
del Example 1
, no aparecerá ningún error o advertencia si el certificado del servidor que recibe la solicitud se ha firmado automáticamente (y, por lo tanto, no está verificado). Como resultado, la aplicación podría filtrar entonces información de usuario confidencial en una conexión SSL interrumpida.
...
import ssl
ssl_sock = ssl.wrap_socket(s)
...
require 'openssl'
...
ctx = OpenSSL::SSL::SSLContext.new
ctx.verify_mode=OpenSSL::SSL::VERIFY_NONE
...
NSURLConnectionDelegate
para que acepte cualquier certificado HTTPS:
class Delegate: NSObject, NSURLConnectionDelegate {
...
func connection(connection: NSURLConnection, canAuthenticateAgainstProtectionSpace protectionSpace: NSURLProtectionSpace?) -> Bool {
return protectionSpace?.authenticationMethod == NSURLAuthenticationMethodServerTrust
}
func connection(connection: NSURLConnection, willSendRequestForAuthenticationChallenge challenge: NSURLAuthenticationChallenge) {
challenge.sender?.useCredential(NSURLCredential(forTrust: challenge.protectionSpace.serverTrust!), forAuthenticationChallenge: challenge)
challenge.sender?.continueWithoutCredentialForAuthenticationChallenge(challenge)
}
}
NSURLConnectionDelegate
del Example 1
, no aparecerá ningún error o advertencia si el certificado del servidor que recibe la solicitud se ha firmado automáticamente (y, por lo tanto, no está verificado). Como resultado, la aplicación podría filtrar entonces información de usuario confidencial en una conexión SSL interrumpida.NSURLSession
, la validación de la cadena SSL/TLS se controla a través del método de delegación de autenticación de la aplicación, pero en lugar de proporcionar al servidor las credenciales para autenticar al usuario (o aplicación), la aplicación comprueba las credenciales que proporciona el servidor durante el intercambio SSL/TLS e indica al sistema de carga de URL si debe aceptar o rechazar esas credenciales. El siguiente código muestra un NSURLSessionDelgate
que devuelve la proposedCredential
del desafío recibido como una credencial para la sesión, lo que en la práctica permite eludir la verificación del servidor:
class MySessionDelegate : NSObject, NSURLSessionDelegate {
...
func URLSession(session: NSURLSession, didReceiveChallenge challenge: NSURLAuthenticationChallenge, completionHandler: (NSURLSessionAuthChallengeDisposition, NSURLCredential?) -> Void) {
...
completionHandler(NSURLSessionAuthChallengeDisposition.UseCredential, challenge.proposedCredential)
...
}
...
}
...
FINAL(client) = cl_apc_tcp_client_manager=>create(
i_host = ip_adress
i_port = port
i_frame = VALUE apc_tcp_frame(
frame_type =
if_apc_tcp_frame_types=>co_frame_type_terminator
terminator =
terminator )
i_event_handler = event_handler ).
...
client
y el servidor remoto es vulnerable a compromisos, porque se transmite a través de un canal no cifrado y no autenticado.
...
HttpRequest req = new HttpRequest();
req.setEndpoint('http://example.com');
HTTPResponse res = new Http().send(req);
...
HttpResponse
, res
, se haya visto comprometido, ya que se proporciona a través de un canal no cifrado ni autenticado.
var account = new CloudStorageAccount(storageCredentials, false);
...
String url = 'http://10.0.2.2:11005/v1/key';
Response response = await get(url, headers: headers);
...
response
, se haya visto comprometida, ya que se proporciona a través de un canal no cifrado ni autenticado.
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
, se haya visto comprometida, ya que se proporciona a través de un canal no cifrado ni autenticado.
var http = require('http');
...
http.request(options, function(res){
...
});
...
http.IncomingMessage
, res
, se haya visto comprometido debido que se proporciona a través de un canal sin cifrar ni autenticar.
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
, se haya visto comprometida, ya que se proporciona a través de un canal no cifrado ni autenticado.
val url = Uri.from(scheme = "http", host = "192.0.2.16", port = 80, path = "/")
val responseFuture: Future[HttpResponse] = Http().singleRequest(HttpRequest(uri = url))
responseFuture
, se haya visto comprometida, ya que se proporciona a través de un canal no cifrado ni autenticado.
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
controla si el servidor sigue las preferencias de los conjuntos de cifrado del cliente o del servidor. Usar el conjunto de cifrado preferido por el cliente puede introducir vulnerabilidades de seguridad si se sabe que el conjunto de cifrado tiene deficiencias.PreferServerCipherSuites
como 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(...)
a utilizar el algoritmo más débil 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
, oCFURL
en iOS 9 o OS X El Capitan, lo que obliga a la aplicación a usar HTTPS
con TLS 1.2
en todas las comunicaciones de red con el servidor back-end.Info.plist
deshabilitarán por completo App Transport Security:Ejemplo 2: Las siguientes entradas de la aplicación
<key>NSAppTransportSecurity</key>
<dict>
<!--Include to allow all connections (DANGER)-->
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Info.plist
deshabilitarán App Transport Security para yourserver.com
:
<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
para cargar su propia página web.
...
using var channel = GrpcChannel.ForAddress("https://grpcserver.com", new GrpcChannelOptions {
Credentials = ChannelCredentials.Insecure
});
...
...
ManagedChannel channel = Grpc.newChannelBuilder("hostname", InsecureChannelCredentials.create()).build();
...
None
. No se puede confiar en los datos enviados con una configuración no segura de credenciales del canal.root_certificates
se configurará en None
, el valor del parámetro private_key
se configurará en None
y el valor del parámetro certificate_chain
se configurará en None
.
...
channel_creds = grpc.ssl_channel_credentials()
...
...
Server server = Grpc.newServerBuilderForPort(port, InsecureServerCredentials.create())
...
None
o False
. No se puede confiar en los datos enviados hacia un servidor y desde él con una configuración de credenciales no segura.
...
pk_cert_chain = your_organization.securelyGetPrivateKeyCertificateChainPairs()
server_creds = grpc.ssl_server_credentials(pk_cert_chain)
...
HSTS
), pero no puede aplicar esta protección a los subdominios, lo que permite que los atacantes roben información confidencial de las conexiones de subdominios mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio que devuelve los encabezados HSTS a través de SSL/TLS durante un período especificado dentro del encabezado. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente por una HTTPS, incluso si el usuario escribe una URL con http://
en la barra de dirección URL del explorador.
<http auto-config="true">
...
<headers>
...
<hsts include-sub-domains="false" />
</headers>
</http>
HSTS
) pero no puede aplicar esta protección a los subdominios, lo que permite que los usuarios malintencionados roben información confidencial de las conexiones de subdominios mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio devolviendo los encabezados HSTS a través de SSL/TLS durante un período especificado en el encabezado en sí. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente con una HTTPS, incluso si el usuario escribe http://
en la barra de dirección URL del explorador.HSTS
). Esto permite que los atacantes reemplacen las conexiones SSL/TLS por conexiones HTTP simples y roben información confidencial mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio que devuelve los encabezados HSTS a través de SSL/TLS durante un período especificado dentro del encabezado. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente por una HTTPS, incluso si el usuario escribe una URL con http://
en la barra de dirección URL del explorador.
<http auto-config="true">
...
<headers>
...
<hsts disabled="true" />
</headers>
</http>
HSTS
), lo que permite a los atacantes reemplazar las conexiones SSL/TLS con simples conexiones HTTP y robar información confidencial, realizando ataques de eliminación de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio devolviendo los encabezados HSTS a través de SSL/TLS durante un período especificado en el encabezado en sí. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente con una HTTPS, incluso si el usuario escribe http://
en la barra de dirección URL del explorador.HSTS
), lo que permite que los usuarios malintencionados reemplacen las conexiones SSL/TLS con HTTP sin formato y roben información confidencial mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio devolviendo los encabezados HSTS a través de SSL/TLS durante un período especificado en el encabezado en sí. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente con una HTTPS, incluso si el usuario escribe http://
en la barra de dirección URL del explorador.modp2
predefinido para inicializar un protocolo de intercambio de claves Diffie-Hellman, que utiliza un valor primo de 1024 bits:
const dh = getDiffieHellman('modp2');
dh.generateKeys();
...
HSTS
) con un tiempo de vencimiento insuficiente. Esto permite que los atacantes reemplacen las conexiones HTTPS por conexiones HTTP simples y roben información confidencial mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio que devuelve los encabezados HSTS a través de SSL/TLS durante un período especificado dentro del encabezado. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente por una HTTPS, incluso si el usuario escribe una URL con http://
en la barra de dirección URL del explorador.
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
...
http.headers(headers ->
headers.httpStrictTransportSecurity(hstsConfig ->
hstsConfig.maxAgeInSeconds(300)
)
);
...
}
HSTS
) con un tiempo de vencimiento insuficiente, lo que permite que los usuarios malintencionados reemplacen las conexiones HTTPS con otras HTTP sin formato y roben información confidencial mediante ataques de extracción de HTTPS.HSTS
) es un encabezado de seguridad que indica al explorador que siempre se conecte al sitio devolviendo los encabezados HSTS a través de SSL/TLS durante un período especificado en el encabezado en sí. Cualquier conexión con el servidor mediante HTTP se reemplazará automáticamente con una HTTPS, incluso si el usuario escribe http://
en la barra de dirección URL del explorador.SmtpClient
está configurado incorrectamente, no utiliza SSL/TLS para comunicarse con un servidor SMTP:
string to = "bob@acme.com";
string from = "alice@acme.com";
MailMessage message = new MailMessage(from, to);
message.Subject = "SMTP client.";
message.Body = @"You can send an email message from an application very easily.";
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
en SSLv23_method
, el servidor es inherentemente inseguro cuando secureProtocol
no se reemplaza específicamente.
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)
...
encryptionKey = "".
...
...
var encryptionKey:String = "";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
char encryptionKey[] = "";
...
...
<cfset encryptionKey = "" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("");
block, err := aes.NewCipher(key)
...
...
private static String encryptionKey = "";
byte[] keyBytes = encryptionKey.getBytes();
SecretKeySpec key = new SecretKeySpec(keyBytes, "AES");
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
...
var crypto = require('crypto');
var encryptionKey = "";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
"",
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
...
$encryption_key = '';
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
...
from Crypto.Ciphers import AES
cipher = AES.new("", AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
require 'openssl'
...
dk = OpenSSL::PKCS5::pbkdf2_hmac_sha1(password, salt, 100000, 0) # returns an empty string
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"",
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
Dim encryptionKey As String
Set encryptionKey = ""
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...