#php #secure-coding #checkmarx #commandinjection
#php #безопасное кодирование #checkmarx #commandinjection
Вопрос:
Извините за очень широкий вопрос, но у нас есть некоторые проблемы, например, Checkmarx жалуется на внедрение кода примерно следующим образом
$accesskey = $_GET['accesskey'] ?? $argv[1] ?? null;
if (!$accesskey || !ctype_alnum($accesskey)) {
throw new RuntimeException(sprintf('Passed accesskey "%s" is invalid', $accesskey));
}
$commandParts = ['echo', $accesskey]
$commandParts = array_map('escapeshellarg', $commandParts);
$command = implode(' ', $commandParts);
$command = escapeshellcmd($command);
system($command);
Я думаю, что команды экранируются, и все в порядке, но почему Checkmarx думает иначе?
Метод <?php приложения вызывает команду операционной системы (оболочки) с system в строке 1 ОТРЕДАКТИРОВАНО, используя ненадежную строку с командой для выполнения.
Это может позволить злоумышленнику ввести произвольную команду и включить атаку с использованием командной строки.
Злоумышленник может ввести выполняемую команду через пользовательский ввод, _GET, который извлекается приложением в методе <?php, в строке 1 ОТРЕДАКТИРОВАННОГО.
Мне также интересно, может ли и как Checkmarx понимать код библиотеки или фреймворка, который устанавливается через Composer? Например.
Assert::oneOf($unsafeUserInput, ['foo', 'bar']); // throws an Exception if $unsafeUserInput is not 'foo' or 'bar'
// $unsafeUserInput is now safe
или материалы, связанные с WP, которые также часто ошибочно помечаются как подверженные SQL-инъекциям
global $wpdb;
$foo = $wpdb->getVar($wpdb->prepare('SELECT foo FROM bar WHERE baz = %s', $_GET['baz'] ?? ''));
Если он проверяет методы дезинфекции, есть ли какой-то конкретный способ, которым они должны выглядеть? Я, честно говоря, хочу избежать изменения слишком большого количества кода для Checkmarx.
Ответ №1:
Ваш вопрос о том, насколько хорошо Checkmarx анализирует PHP-код, может склоняться к субъективному ответу, и ваше восприятие инструмента может быть предвзятым, учитывая, что вы используете методы (escapeshellcmd), которые не распознаются как дезинфицирующие средства, а фреймворк, о котором вы спрашиваете (WordPress и Composer), технически не поддерживается.
Справедливости ради следует отметить, что Checkmarx поддерживает различные фреймворки PHP, такие как Zend, Kohana, CakePHP, Symfony и Smarty, что может привести к меньшим ложным срабатываниям (примечание: я не предлагаю вам переключать платформы)
Для эффективной работы любым статическим анализаторам потребуется помощь ИТ-пользователей. Я бы посоветовал вам исключить файлы Composer из проверки.
На самом деле вам не нужно вносить изменения в код и просто спорить со своей командой AppSec о том, что эти результаты являются ложными срабатываниями, поскольку метод prepare предотвращает атаки SQL-инъекций и что escapeshellcmd кодирует строку. Однако я рекомендую вместо этого использовать escapeshellarg для $accesskey