Это плагин для Phan, чтобы попытаться обнаружить проблемы безопасности (например, XSS). Он отслеживает любое время, когда пользователь может изменить переменную, и проверяет, что такие переменные избегаются до вывода в качестве HTML или используются в качестве запроса SQL и т. Д.
Он поддерживает общие проекты PHP, а также имеет выделенный режим для кода MediaWiki (анализирует крючки, HTMLForms и методы базы данных).
Веб -демонстрация доступна.
$ composer require --dev mediawiki/phan-taint-check-plugin
Плагин можно использовать как в «ручном», так и в «автономном» режиме. Первый - лучший выбор, если ваш проект уже работает PHAN, и почти не требуется конфигурация. Последнее следует использовать только в том случае, если вы не хотите добавлять PHAN в свой проект, и не поддерживается для кода, связанного с MediaWiki. Для получения дополнительной информации о использовании Wikimedia этого плагина см. Https://www.mediawiki.org/wiki/phan-taint-check-plugin.
Вам просто нужно добавить в раздел плагинов в раздел plugins вашего конфигурации PHAN. Предполагая, что проверка по Taint находится в стандартном месте поставщика, например $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; , файл, который включает в себя "$seccheckPath/GenericSecurityCheckPlugin.php" для общего проекта и "$seccheckPath/MediaWikiSecurityCheckPlugin.php" для проекта MediaWiki.
Кроме того, убедитесь, что быстрый режим отключен, иначе плагин не будет работать:
' quick_mode ' => false Вы также должны добавить SecurityCheck-LikelyFalsePositive и SecurityCheck-PHPSerializeInjection к suppress_issue_types (последний имеет высокую скорость ложных срабатываний).
Затем запустите Фана, как обычно:
$ vendor/bin/phan -d . --long-progress-bar
Запуск PHAN с --analyze-twice поймет дополнительные проблемы безопасности, которые могут остаться незамеченными на фазе нормального анализа. Известным ограничением этого является то, что об той же проблеме можно сообщить более одного раза с различными вызванными линиями.
Вы можете запустить проверку по стойке через:
$ ./vendor/bin/seccheck
Вы можете добавить к этому псевдоним сценария композитора:
"scripts" : {
"seccheck" : " seccheck "
}Обратите внимание, что ложные позитивы отключены по умолчанию.
Плагин выведет различные типы проблем в зависимости от того, что он обнаруживает. Типы проблем, которые вы получаете:
SecurityCheck-XSSSecurityCheck-SQLInjectionSecurityCheck-ShellInjectionSecurityCheck-PHPSerializeInjection - когда кто -то делает unserialize( $_GET['d'] ); Этот тип проблемы, по -видимому, в настоящее время обладает высокой ложной положительной скоростью.SecurityCheck-CUSTOM1 - чтобы позволить людям иметь настраиваемые типы порожденийSecurityCheck-CUSTOM2 - то же самоеSecurityCheck-DoubleEscaped - обнаружение, что HTML дважды сбежатSecurityCheck-RCE - Удаленное выполнение кода, например eval( $_GET['foo'] )SecurityCheck-PathTraversal - прохождение пути, например require $_GET['foo']SecurityCheck-ReDoS - Регулярное отрицание лицензионного обслуживания (REDOS), например, preg_match( $_GET['foo'], 'foo')SecurityCheck-LikelyFalsePositive - потенциальная проблема, но, вероятно, нет. В основном случается, когда плагин запутался. Поле тяжести обычно помечается как Issue::SEVERITY_NORMAL (5) . Ложные позитивы Получите Issue::SEVERITY_LOW (0) . Проблемы, которые могут привести к компромиссу сервера (в отличие от простого компромисса конечного пользователя), таких как Shell или SQL -инъекция, помечены как Issue::SEVERITY_CRITICAL (10) . SerializationIngection обычно будет «критическим», но в настоящее время она обозначена как серьезность нормальной, потому что проверка, по -видимому, имеет высокую ложную положительную скорость в данный момент.
Вы можете использовать вариант командной строки -y для фильтрации по серьезности.
Если вам нужно подавить ложный положительный, вы можете поместить @suppress NAME-OF-WARNING в DocBlock для функции/метода. В качестве альтернативы, вы можете использовать другие типы подавления, такие как @phan-suppress-next-line . Смотрите Phan's Readme для полного списка. @param-taint и @return-taint (см. Раздел «Настройка») также очень полезны с использованием ложных срабатываний.
Обратите внимание, что плагин сообщит о возможной уязвимости XSS в контексте CLI. Чтобы избежать их, вы можете подавить по всей файле SecurityCheck-XSS с помощью @phan-file-suppress в сценариях CLI или для всего приложения (используя опцию конфигурации suppress_issue_types ), если приложение состоит только из сценариев CLI. В качестве альтернативы, если все выводы происходит из внутренней функции, вы можете использовать @param-taint следующим образом:
/**
* @param-taint $stuffToPrint none
*/
public function printMyStuff ( string $ stuffToPrint ) {
echo $ stuffToPrint ;
}При отладке вопросов безопасности вы можете использовать:
'@phan-debug-var-taintedness $varname';
Это излучит проблему SecurityCheckDebugTaintedness , содержащую испорченность $varname на линии, где находится аннотация. Обратите внимание, что вы должны вставить аннотацию в струнный буквальный; Комментарии не будут работать. Смотрите также аннотацию Phan @phan-debug-var .
@return-taint html .$options ) и шестой ( $join_cond ) из Mediawiki's IDatabase::select() , если он предоставлен непосредственно в виде литерала массива или непосредственно возвращается в виде массива из метода getQueryInfo() . Плагин поддерживает настроение путем подкласса класса SecurityCheckplugin. Для сложного примера этого, см. MediaWikiseCerationCheckplugin.
Иногда у вас есть методы в вашей кодовой базе, которые изменяют распределение переменной. Например, пользовательская функция выхода HTML должна очистить HTML -бит. Точно так же иногда Phan-Taint-Ceck может запутаться, и вы хотите переопределить поля, рассчитанную для конкретной функции.
Вы можете сделать это, добавив давнюю директиву в комментарии Docblock. Например:
/**
* My function description
*
* @param string $html the text to be escaped
* @param-taint $html escapes_html
*/
function escapeHtml ( $ html ) {
}Методы также наследуют эти директивы от абстрактных определений на интерфейсах предков, но не от конкретных реализаций в классах предков.
Директивы Taint префикс с помощью @param-taint $parametername или @return-taint . Если есть несколько директив, они могут быть разделены запятыми. @param-taint используется либо для обозначения того, как Taint передается из параметра в возвращаемое значение методов, либо при использовании с директивами exec_ , чтобы отметить места, где выводится/выполняются параметры. @return-taint используется для регулировки ареста возвращаемого значения независимо от входных параметров.
Тип директив включает в себя:
exec_$TYPE - если параметр помечен как exec_$TYPE то подавление этого параметра A значения с помощью $TYPE teaint приведет к запустимому предупреждению. Обычно вы используете это, когда функция, которая выводит или выполняет его параметрescapes_$TYPE - Используется для параметров, где функция уходит, а затем возвращает параметр. Таким образом, escapes_sql очистил бы бит SQL, но оставите другие биты в покое.onlysafefor_$TYPE - для использования в @return-taint , отмечает тип возврата как безопасный для конкретного $TYPE но небезопасно для других типов.$TYPE - если только тип указан в параметре, он битваен и с улостью входной переменной. Обычно вы не захотите этого делать, но можете быть полезным, когда $TYPE none указать, что параметр не используется для генерации возврата. В @return это может быть использовано для перечисления того, какие флаги имеют возвратное значение, что обычно полезно только при указании как tainted , чтобы сказать, что у него есть все флаги.array_ok - флаг специального назначения, чтобы сказать, игнорировать испорченные аргументы, если они находятся в массиве.allow_override -Флаг специального назначения, чтобы указать, что эта анонация должна быть переопределена с помощью Phan-Taint-Ceck, если она может обнаружить определенную атмосферу. Значение для $TYPE может быть одним из htmlnoent , html , sql , shell , serialize , custom1 , custom2 , code , path , regex , sql_numkey , escaped , none , tainted . Большинство из них - это категории, кроме:
htmlnoent - как html но отключите двойное обнаружение, которое используется с html . Когда указан escapes_html , сбежать автоматически добавляется в @return , а exec_escaped добавляется в @param . Только аналогично onlysafefor_html эквивалентен onlysafefor_htmlnoent,escaped .none - не означает никакого порцииtainted - означает все категории Take, кроме специальных категорий (эквивалентно SecurityCheckPlugin::YES_TAINT )escaped - используется, чтобы означать, что значение уже сбежалось (для отслеживания двойного побега)sql_numkey - это довольно особая цель для MediaWiki. Он игнорирует арест в массивах, если они для ассоциативных ключей. Значение по умолчанию для @param-taint tainted , если это строка (или другой опасный тип), и none , если это что-то вроде целого числа. Значение по умолчанию для @return-taint является allow_override (что эквивалентно none , если только что-то лучшее не может быть автоматическим).
Вместо того, чтобы аннотировать методы в вашей кодовой базе, вы также можете настроить Phan-Taint-Ceck, чтобы получить знание методов Taints. Кроме того, вы можете расширить плагин, чтобы иметь довольно произвольное поведение.
Для этого вы переопределяете метод getCustomFuncTaints() . Этот метод возвращает ассоциативный массив полностью квалифицированных имен методов в массив, описывающее, как распределение возвращаемого значения функции с точки зрения ее аргументов. Числовые клавиши соответствуют количеству аргумента, а ключ «общий» добавляет усадьбу, которая не присутствует ни в одном из аргументов. По сути, для каждого аргумента плагин берет на себя порцию аргумента, побито и его вход в массив, а затем бить или является общим ключом. Если у кого -либо из ключей в массиве есть флаги EXEC, то проблема сразу поднимается, если соответствует соответствующему делу функции (например, выходная функция). Флаги EXEC не работают в ключе «общий».
Например, HTMLSpecialChars, которые удаляют HTML -порцию, избегают своего аргумента и возвращают сбежавшее значение, будет выглядеть как:
' htmlspecialchars ' => [
( self :: YES_TAINT & ~ self :: HTML_TAINT ) | self :: ESCAPED_EXEC_TAINT ,
' overall ' => self :: ESCAPED ,
];Следующие переменные среды влияют на плагин. Обычно вам не придется регулировать их.
SECURITY_CHECK_EXT_PATH - Путь к каталогу, содержащий extension.json / skin.json в режиме Mediawiki. Если не настроен, предполагает каталог Project Root.SECCHECK_DEBUG - Файл для вывода дополнительной информации отладки (при запуске из shell , /dev/stderr удобно) GNU General Public License, версия 2 или позже