Трудно закодированные уязвимые данные происходят, когда данные, которые потенциально чувствительны, непосредственно отсоединены в коде, например, как строковые литералы. Средство проверки идентифицирует данные, столь же чувствительные от их использования в определенных функциях, таких как функции шифрования пароля.
Следующие данные могут быть потенциально чувствительными.
Тип данных | Функции, которые указывают на деликатный характер информации |
---|
Имя хоста |
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 (2-й аргумент)
|
Пароль |
CreateProcessWithLogonW , LogonUser (1-й аргумент)
mysql_real_connect , mysql_real_connect_nonblocking , mysql_connect (3-й аргумент)
|
База данных |
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 (3-й аргумент)
|
Имя пользователя |
getpw , getpwnam , getpwnam_r , getpwuid , getpwuid_r
|
Соль | crypt , crypt_r (2-й аргумент) |
Ключи криптографии и векторы инициализации | OpenSSL:
EVP_CipherInit , EVP_EncryptInit , EVP_DecryptInit (3-й аргумент)
EVP_CipherInit_ex , EVP_EncryptInit_ex , EVP_DecryptInit_ex (4-й аргумент)
|
Seed |
srand , srandom , initstate (1-й аргумент)
OpenSSL: RAND_seed , RAND_add
|
Риск
Информация, которая является hardcoded, может быть запрошена от двоичных файлов, сгенерированных из кода.
Фиксация
Постарайтесь не трудно кодировать уязвимую информацию.
Пример – уязвимые данные, отсоединенные через строковые литералы
// 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;
}