これは、セキュリティの問題(XSSなど)を検出しようとするPHANへのプラグインです。ユーザーが変数を変更できるときはいつでも追跡し、HTMLとして出力されるか、SQLクエリなどとして使用される前に、そのような変数が逃げられることを確認します。
一般的なPHPプロジェクトをサポートしており、MediaWikiコードの専用モードも備えています(分析フック、HTMLForms、およびデータベースメソッド)。
Webデモが利用可能です。
$ 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を追加する必要があります。 Taint-checkが標準ベンダーの場所にあると仮定すると、例: $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; 、含まれるファイルは、ジェネリックプロジェクトの"$seccheckPath/GenericSecurityCheckPlugin.php" 、およびmediawikiプロジェクトの"$seccheckPath/MediaWikiSecurityCheckPlugin.php"です。
また、クイックモードが無効になっているか、プラグインが機能しないことを確認してください。
' quick_mode ' => falseまた、 suppress_issue_typesにSecurityCheck-LikelyFalsePositiveとSecurityCheck-PHPSerializeInjectionを追加する必要があります(後者は誤検知の割合が高くなっています)。
次に、通常のようにファンを実行します。
$ 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パストラバーサル、例えば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)としてマークされます。 SerializationInjectionは通常「クリティカル」になりますが、現在、チェックは現時点で高い誤検知率を持っているように見えるため、現在は正常の重大度として示されています。
Phanの-yコマンドラインオプションを使用して、重大度によってフィルタリングできます。
False Positionを抑制する必要がある場合は、関数/メソッドのために@suppress NAME-OF-WARNING docblockに配置できます。または、 @phan-suppress-next-lineなど、他のタイプの抑制を使用できます。完全なリストについては、PhanのReadmeを参照してください。 @param-taintと@return-taint (「カスタマイズ」セクションを参照)も、誤検知を扱うことに非常に役立ちます。
プラグインは、CLIコンテキストでXSSの脆弱性を報告することに注意してください。それらを回避するために、CLIスクリプトの@phan-file-suppressを使用してSecurityCheck-XSSを抑制するか、アプリケーションがCLIスクリプトのみで構成されている場合は、アプリケーション全体( suppress_issue_types Configオプションを使用)を抑制できます。または、すべての出力が内部関数から発生した場合、次のように@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()メディアウィキのIDatabase::select()の5番目( $options )と6番目( $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 ) {
}方法は、祖先インターフェイスの抽象的な定義からこれらの指令を継承しますが、先祖クラスの具体的な実装からではありません。
Taintディレクティブには@param-taint $parameternameまたは@return-taintのいずれかが付いています。複数の指令がある場合、それらはコンマによって分離できます。 @param-taintパラメーターから[パラメーターから返信される方法]をマークするために使用されるか、 exec_ディレクティブで使用する場合、パラメーターが出力/実行される場所をマークするために使用されます。 @return-taint入力パラメーターに関係なく、返品値のテントを調整するために使用されます。
ディレクティブのタイプには次のものがあります。
exec_$TYPE -Parameterがexec_$TYPEとしてマークされている場合、そのパラメーターに$TYPE汚染で値をフィードすると、警告がトリガーされます。通常、パラメーターを出力または実行する関数の場合、これを使用しますescapes_$TYPE - 関数が逃げてパラメーターを返すパラメーターに使用されます。したがって、 escapes_sql SQL Taintビットをクリアしますが、他の汚染ビットをそのままにしておきます。onlysafefor_$TYPE - @return-taintで使用するために、特定の$TYPEに対しては安全であるが、他のタイプでは安全でないとマークします。$TYPE -PARAMETERでタイプのみが指定されている場合、入力変数の汚染で噛まれます。通常、これを行いたくありませんが、 $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メディアウィキにとってはかなり特別な目的です。それらが連想キー用である場合、アレイの汚染を無視します。 @param-taintのデフォルト値は、文字列(または他の危険なタイプ)の場合はtainted 、整数のようなものである場合はnone 。 @return-taintのデフォルト値は、 allow_overrideです(これは、より良いものをオートドット化できない限り、 noneにも相当します)。
コードベースにメソッドを注釈する代わりに、ファンテントチェックをカスタマイズして、メソッドのテントの知識を組み込むこともできます。さらに、プラグインを拡張して、かなりarbitrary意的な動作をすることができます。
これを行うには、 getCustomFuncTaints()メソッドをオーバーライドします。このメソッドは、完全に適格なメソッド名の連想配列を配列に返し、その引数の観点から関数の戻り値の汚れを説明する配列に返します。数値キーは引数の数に対応し、「全体的な」キーは、いずれの引数にも存在しない汚染を追加します。基本的に、各引数について、プラグインは引数の汚れをビットワイズにし、それを配列へのエントリにしてから、ビットワイズまたは全体的なキーです。配列内のキーのいずれかにexecフラグがある場合、対応する汚染が関数に供給される場合(たとえば、出力関数)、問題がすぐに発生します。 Exec Flagsは「全体的な」キーでは機能しません。
たとえば、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 file ful ful /dev/stderr ful fotex debug information GNU一般公開ライセンス、バージョン2以降