이것은 보안 문제 (예 : XSS)를 시도하고 감지하기위한 Phan의 플러그인입니다. 사용자가 변수를 수정할 수있는 시간을 추적하고 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을 참조하십시오.
Phan 구성의 plugins 섹션에 오염 체크를 추가하면됩니다. Taint-Check가 표준 공급 업체 위치에 있다고 가정하면, eg $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; , 포함 할 파일은 일반 프로젝트의 경우 "$seccheckPath/GenericSecurityCheckPlugin.php" 이고 MediaWiki 프로젝트의 경우 "$seccheckPath/MediaWikiSecurityCheckPlugin.php" 입니다.
또한 빠른 모드가 비활성화되었거나 플러그인이 작동하지 않도록하십시오.
' quick_mode ' => false 또한 SecurityCheck-LikelyFalsePositive 및 SecurityCheck-PHPSerializeInjection suppress_issue_types 추가해야합니다.
그런 다음 평소와 같이 Phan을 실행하십시오.
$ vendor/bin/phan -d . --long-progress-bar
--analyze-twice 로 Phan을 실행하면 일반 분석 단계에서 눈에 띄지 않을 수있는 추가 보안 문제가 발생합니다. 이것의 알려진 한계는 동일한 문제가 다른 원인으로 두 번 이상보고 될 수 있다는 것입니다.
다음을 통해 Taint-Check을 실행할 수 있습니다.
$ ./vendor/bin/seccheck
이를 위해 작곡가 스크립트 별칭을 추가 할 수 있습니다.
"scripts" : {
"seccheck" : " seccheck "
}오 탐지는 기본적으로 비활성화됩니다.
플러그인은 감지하는 내용에 따라 다양한 문제 유형을 출력합니다. 출력 유형은 다음과 같습니다.
SecurityCheck-XSSSecurityCheck-SQLInjectionSecurityCheck-ShellInjectionSecurityCheck-PHPSerializeInjection 누군가 unserialize( $_GET['d'] ); 이 문제 유형은 현재 높은 오 탐지율을 갖는 것 같습니다.SecurityCheck-CUSTOM1 사람들이 맞춤형 오이트 유형을 가질 수 있도록SecurityCheck-CUSTOM2 -DittoSecurityCheck-DoubleEscaped HTML이 이중 탈출되고 있음을 감지합니다SecurityCheck-RCE 원격 코드 실행, 예 : eval( $_GET['foo'] )SecurityCheck-PathTraversal -Path Traversal, 예를 들어 require $_GET['foo']SecurityCheck-ReDoS 정규 표현식 거부 서비스 (redos), 예를 들어 preg_match( $_GET['foo'], 'foo')SecurityCheck-LikelyFalsePositive 잠재적 인 문제이지만 아마도 그렇지 않을 것입니다. 플러그인이 혼란 스러울 때 대부분 발생합니다. 심각도 필드는 일반적으로 Issue::SEVERITY_NORMAL (5) . 잘못된 긍정은 Issue::SEVERITY_LOW (0) . 쉘 또는 SQL 주입과 같은 서버 타협 (최종 사용자 타협과 달리)이 발생할 수있는 문제는 Issue::SEVERITY_CRITICAL (10) 로 표시됩니다. 직렬화는 일반적으로 "중요한"일이지만 현재 점검이 현재 높은 오 탐지율을 갖는 것처럼 보이기 때문에 현재 정상의 심각도로 표시됩니다.
Phan의 -y 명령 줄 옵션을 사용하여 심각도로 필터링 할 수 있습니다.
잘못된 양수를 억제 해야하는 경우 @suppress NAME-OF-WARNING docBlock에 함수/메소드에 넣을 수 있습니다. 또는 @phan-suppress-next-line 과 같은 다른 유형의 억제를 사용할 수 있습니다. 전체 목록은 Phan의 ReadMe를 참조하십시오. @param-taint 및 @return-taint ( "사용자 정의"섹션 참조)는 잘못된 양성을 다루는 데 매우 유용합니다.
플러그인은 CLI 컨텍스트에서 가능한 XSS 취약점을보고합니다. 이를 피하기 위해 응용 프로그램이 CLI 스크립트로만 구성된 경우 전체 애플리케이션 ( suppress_issue_types config 옵션 사용)에서 @phan-file-suppress 사용하여 SecurityCheck-XSS 파일 전체에 억제 할 수 있습니다. 또는 내부 기능에서 모든 출력이 발생하면 다음과 같이 @param-taint 사용할 수 있습니다.
/**
* @param-taint $stuffToPrint none
*/
public function printMyStuff ( string $ stuffToPrint ) {
echo $ stuffToPrint ;
}보안 문제를 디버깅 할 때 다음을 사용할 수 있습니다.
'@phan-debug-var-taintedness $varname';
이것은 주석이 발견되는 줄에서 $varname 의 오염을 포함하는 SecurityCheckDebugTaintedness 문제를 방출합니다. 문자열 리터럴에 주석을 삽입해야합니다. 의견은 작동하지 않습니다. Phan의 @phan-debug-var 주석도 참조하십시오.
@return-taint html 로 표시하는 것입니다.getQueryInfo() 메소드에서 배열 리터럴로 직접 반환 된 경우 MediaWiki의 IDatabase::select() 의 다섯 번째 ( $options ) 및 Sixth ( $join_cond ) 만 검증 할 수 있습니다. 플러그인은 SecurityCheckPlugin 클래스를 서브 클래싱하여 사용자 정의하는 것을 지원합니다. 그렇게하는 복잡한 예는 MediaWikiseCurityCheckplugin을 참조하십시오.
때로는 코드베이스에 변수의 오염을 변경하는 메소드가 있습니다. 예를 들어, 사용자 정의 HTML 이스케이프 함수는 HTML 오염 비트를 제거해야합니다. 마찬가지로, 때때로 Phan-Taint-Check은 혼란스러워 질 수 있으며 특정 기능에 대해 계산 된 오염을 무시하고자합니다.
DocBlock 주석에 오염 지침을 추가하여이를 수행 할 수 있습니다. 예를 들어:
/**
* My function description
*
* @param string $html the text to be escaped
* @param-taint $html escapes_html
*/
function escapeHtml ( $ html ) {
}방법은 또한 조상 인터페이스의 추상 정의에서 이러한 지시를 물려 받지만 조상 클래스의 구체적인 구현은 아닙니다.
오염 지시문은 @param-taint $parametername 또는 @return-taint 로 접두사가 있습니다. 여러 지시문이있는 경우 쉼표로 분리 할 수 있습니다. @param-taint 매개 변수에서 메소드 리턴 값으로 오염이 전송되는 방법 또는 exec_ 지시문과 함께 사용하는 경우 매개 변수가 출력/실행되는 위치를 표시하는 데 사용됩니다. @return-taint 입력 매개 변수에 관계없이 리턴 값의 오염을 조정하는 데 사용됩니다.
지시문 유형에는 다음이 포함됩니다.
exec_$TYPE 매개 변수가 exec_$TYPE 으로 표시되면 해당 매개 변수를 $TYPE 테인트로 공급하면 경고가 트리거됩니다. 일반적으로 매개 변수를 출력하거나 실행하는 기능이있을 때는 이것을 사용합니다.escapes_$TYPE - 함수가 빠져 나오는 매개 변수에 사용 된 다음 매개 변수를 반환합니다. 따라서 escapes_sql SQL Taint 비트를 제거하지만 다른 오염 비트를 내버려 두십시오.onlysafefor_$TYPE - @return-taint 에서 사용하기 위해 리턴 유형을 특정 $TYPE 의 경우 안전하지만 다른 유형에 대해 안전하지 않습니다.$TYPE - 유형 만 매개 변수에 지정된 경우 BitWised이며 입력 변수의 오염이 있습니다. 일반적 으로이 작업을 원하지 않지만 $TYPE none 때 유용 할 수 있습니다. 매개 변수가 리턴 값을 생성하는 데 사용되지 않음을 지정하는 데 유용 할 수 있습니다. @return 에서 이것은 리턴 값이 가지고있는 오염 깃발을 열거하는 데 사용될 수 있으며, 이는 tainted 으로 모든 깃발이 있다고 말하기 위해 지정된 경우에만 유용합니다.array_ok 오염 된 인수가 배열에 있다면 오염 된 인수를 무시하는 특수 목적 플래그.allow_override 특정 오염을 감지 할 수있는 경우 Phan-Taint-Check에 의해 오염 주석을 상환해야한다고 지정하는 특수 목적 플래그. $TYPE 의 값은 htmlnoent , html , sql , shell , serialize , custom1 , custom2 , code , path , regex , sql_numkey , escaped , none , tainted 중 하나 일 수 있습니다. 이들 중 대부분은 다음을 제외한 오염 카테고리입니다.
htmlnoent html 과 같이 html 과 함께 사용되는 이중 탈출 감지를 비활성화합니다. escapes_html 지정되면 ESCAPED가 자동으로 @return 에 추가되고 exec_escaped @param 에 추가됩니다. 마찬가지로 onlysafefor_html onlysafefor_htmlnoent,escaped 것과 동일합니다.none - 오염이 없습니다tainted - 특수 카테고리를 제외한 모든 오염 카테고리를 의미합니다 ( SecurityCheckPlugin::YES_TAINT 와 동일)escaped - 값이 이미 탈출되었음을 의미하는 데 사용됩니다 (이중 탈출을 추적하기 위해)sql_numkey MediaWiki의 특별한 목적입니다. 연관 키라면 어레이에서 오염을 무시합니다. @param-taint 의 기본값은 문자열 (또는 기타 위험한 유형)이면 tainted 되며 정수와 같은 경우에는 none . @return-taint 의 기본값은 allow_override 입니다 (더 나은 것이 자동으로 검출 될 수 없다면 none ).
코드베이스에 주석을 달성하는 대신 Phan-Taint-Check를 사용자 정의하여 메소드 테인트에 대한 지식을 구축 할 수도 있습니다. 또한 플러그인을 확장하여 상당히 임의의 동작을 할 수 있습니다.
이렇게하려면 getCustomFuncTaints() 메소드를 무시합니다. 이 메소드는 완전히 자격을 갖춘 메소드 이름의 연관 배열을 인수 측면에서 기능의 반환 값의 오염을 설명하는 배열에 반환합니다. 숫자 키는 인수의 수에 해당하며 '전체'키는 인수에 존재하지 않는 오염을 추가합니다. 기본적으로 각 인수에 대해 플러그인은 인수의 오염을 취하고 배열의 항목에 이르고 Bitwise 또는 전체 키입니다. 배열의 키 중 하나라면 EXEC 플래그가 있으면 해당 오염이 함수 (예 : 출력 함수)가 공급되면 즉시 문제가 발생합니다. exec 플래그는 '전체'키에서 작동하지 않습니다.
예를 들어, html 오염을 제거하고 인수를 피하고 탈출 한 값을 반환하는 htmlspecialchars는 다음과 같습니다.
' htmlspecialchars ' => [
( self :: YES_TAINT & ~ self :: HTML_TAINT ) | self :: ESCAPED_EXEC_TAINT ,
' overall ' => self :: ESCAPED ,
];다음 환경 변수는 플러그인에 영향을 미칩니다. 일반적으로 조정할 필요가 없습니다.
SECURITY_CHECK_EXT_PATH MediaWiki 모드에있을 때 extension.json / skin.json 포함하는 디렉토리로가는 경로. 설정되지 않은 경우 프로젝트 루트 디렉토리를 가정합니다.SECCHECK_DEBUG 추가 디버그 정보를 출력하기위한 파일 ( shell 에서 실행되는 경우 /dev/stderr 편리합니다) GNU 일반 공개 라이센스, 버전 2 이상