Жестко закодированные конфиденциальные данные возникают, когда потенциально чувствительные данные экспонируются непосредственно в коде, например, в виде строковых литералов. Средство проверки идентифицирует данные как чувствительные от их использования в определенных функциях, таких как функции шифрования паролей.
Следующие данные могут быть потенциально чувствительными.
| Тип данных | Функции, указывающие на чувствительный характер информации |
|---|
| Имя хоста |
sethostname, setdomainname, gethostbyname, gethostbyname2, getaddrinfo, gethostbyname_r, gethostbyname2_r (строковый аргумент)
inet_aton, inet_pton, inet_net_pton, inet_addr, inet_network (строковый аргумент)
mysql_real_connect, mysql_real_connect_nonblocking, mysql_connect (второй аргумент)
|
| Пароль |
CreateProcessWithLogonW, LogonUser (1-й аргумент)
mysql_real_connect, mysql_real_connect_nonblocking, mysql_connect (третий аргумент)
|
| База данных |
MySQL: mysql_real_connect, mysql_real_connect_nonblocking, mysql_connect (4-й аргумент) SQLite: sqlite3_open, sqlite3_open16, sqlite3_open_v2 (1-й аргумент) PostgreSQL: PQconnectdb Microsoft SQL: SQLDriverConnect (третий аргумент)
|
| Имя пользователя |
getpw, getpwnam, getpwnam_r, getpwuid, getpwuid_r
|
| Соль | crypt, crypt_r (второй аргумент) |
| Ключи криптографии и векторы инициализации | OpenSSL:
EVP_CipherInit, EVP_EncryptInit, EVP_DecryptInit (третий аргумент)
EVP_CipherInit_ex, EVP_EncryptInit_ex, EVP_DecryptInit_ex (4-й аргумент)
|
| Семя |
srand, srandom, initstate (1-й аргумент)
OpenSSL: RAND_seed, RAND_add
|
РискИнформация, которая жестко закодирована, может быть запрошена из двоичных файлов, сгенерированных из кода.
ЗафиксироватьИзбегайте жесткого кодирования конфиденциальной информации.
Пример - Конфиденциальные данные, передаваемые через строковые литералы// Typically, you include the header "mysql.h" with function and type declarations.
// In this example, only the required lines from the header are quoted.
typedef struct _MYSQL MYSQL;
MYSQL *mysql_real_connect(MYSQL *mysql,
const char *host, const char *user, const char *passwd,
const char *db, unsigned int port, const char *unix_socket,
unsigned long client_flag);
typedef void * DbHandle;
extern MYSQL *sql;
// File that uses functions from "mysql.h"
const char *host = "localhost";
char *user = "guest";
char *passwd;
DbHandle connect_to_database_server(const char *db)
{
passwd = (char*)"guest";
return (DbHandle)
mysql_real_connect (sql, host, user, passwd, db, 0, 0x0, 0);
}В этом примере mysql_real_connect аргументы host (имя хоста), user (имя пользователя), и passwd (пароль) представляют собой строковые литералы и непосредственно отображаются в коде.
Запрос сгенерированного двоичного файла для строк ASCII может выявить эту информацию.
Исправление - считывание конфиденциальных данных из защищенных файлов конфигурацииОдной из возможных корректировок является считывание данных из конфигурационного файла. В следующем исправленном примере вызов функции connect_to_database_server_init предположительно считывает имя хоста, имя пользователя и пароль в аргументы из защищенного файла конфигурации.
// Typically, you include the header "mysql.h" with function and type declarations.
// In this example, only the required lines from the header are quoted.
typedef struct _MYSQL MYSQL;
MYSQL *mysql_real_connect(MYSQL *mysql,
const char *host, const char *user, const char *passwd,
const char *db, unsigned int port, const char *unix_socket,
unsigned long client_flag);
typedef void * DbHandle;
extern MYSQL *sql;
// File that uses functions from "mysql.h"
DbHandle connect_to_database_server(const char *db)
{
const char *host_from_cfg;
const char *user_from_cfg;
const char *passwd_from_cfg;
const char *db_from_cfg;
if (connect_to_database_server_init(&host_from_cfg,
&user_from_cfg,
&passwd_from_cfg,
&db_from_cfg))
{
return (DbHandle)
mysql_real_connect (sql, host_from_cfg, user_from_cfg,
passwd_from_cfg, db_from_cfg, 0, 0x0, 0);
}
else
return (DbHandle)0x0;
}