CERT C: Rule MSC41-C

Никогда не конфиденциальная информация о жестком коде

Описание

Определение правила

Никогда не конфиденциальная информация о жестком коде.[1]

Реализация Polyspace

Эта проверка проверяет наличие жестко закодированных конфиденциальных данных.

Примеры

расширить все

Жестко закодированные конфиденциальные данные возникают, когда данные, которые потенциально чувствительны, непосредственно представлены в коде, например, как строковые литералы. Чекер идентифицирует данные как чувствительные от их использования в определенных функциях, таких как функции шифрования пароля.

Следующие данные могут быть потенциально чувствительными.

Тип данныхФункции, которые указывают на чувствительный характер информации
Имя хоста
  • 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

Риск

Информация, которая является жесткой кодировкой, может быть запрошена из двоичных файлов, сгенерированных из кода.

Зафиксировать

Избегайте жесткого кодирования конфиденциальной информации.

Пример - Чувствительные данные, доступные через строковые литералы
// 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;
}

Проверяйте информацию

Группа: Правило 48. Разное (MSC)
Введенный в R2020a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.