Dies ist ein Plugin zu Phan, um Sicherheitsprobleme (wie XSS) zu erkennen. Es verfolgt jedes Mal, dass ein Benutzer eine Variable ändern kann, und prüft, ob solche Variablen entkommen werden, bevor sie als HTML ausgegeben oder als SQL -Abfrage verwendet werden, usw.
Es unterstützt generische PHP -Projekte und verfügt auch über einen dedizierten Modus für MediaWiki -Code (Analysen von Hooks, HTMLForms und Datenbankmethoden).
Eine Webdemo ist verfügbar.
$ composer require --dev mediawiki/phan-taint-check-plugin
Das Plugin kann sowohl im "manuellen" als auch im "eigenständigen" Modus verwendet werden. Ersteres ist die beste Wahl, wenn Ihr Projekt bereits Phan ausführt und fast keine Konfiguration erforderlich ist. Letzteres sollte nur verwendet werden, wenn Sie Phan nicht zu Ihrem Projekt hinzufügen möchten, und wird nicht für den Medienwiki-Code unterstützt. Weitere Informationen zur Verwendung dieses Plugins durch Wikimedia finden Sie unter https://www.mediawiki.org/wiki/phan-taint-check-plugin.
Sie müssen einfach den plugins -Abschnitt Ihrer Phan-Konfiguration auf den Abschnitt "Plugins" hinzufügen. Unter der Annahme, dass sich Taint-Check am Standort des Standard-Anbieters befindet, z. $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; Die Datei, die "$seccheckPath/GenericSecurityCheckPlugin.php" für ein generisches Projekt und "$seccheckPath/MediaWikiSecurityCheckPlugin.php" für ein Mediawiki -Projekt enthält.
Stellen Sie außerdem sicher, dass der Schnellmodus deaktiviert ist oder das Plugin nicht funktioniert:
' quick_mode ' => false Sie sollten auch SecurityCheck-LikelyFalsePositive und SecurityCheck-PHPSerializeInjection addieren, um suppress_issue_types .
Dann laufen Sie Phan wie gewohnt:
$ vendor/bin/phan -d . --long-progress-bar
Durch das Ausführen von Phan mit --analyze-twice wird zusätzliche Sicherheitsprobleme auftreten, die in der normalen Analysephase möglicherweise unbemerkt bleiben. Eine bekannte Einschränkung davon ist, dass das gleiche Problem mehr als einmal mit unterschiedlichen Zeilen gemeldet werden kann.
Sie können einen Merkmalen-Check über:
$ ./vendor/bin/seccheck
Vielleicht möchten Sie dafür einen Komponisten -Skript -Alias hinzufügen:
"scripts" : {
"seccheck" : " seccheck "
}Beachten Sie, dass Fehlalarme standardmäßig deaktiviert sind.
Das Plugin gibt verschiedene Ausgabetypen aus, je nachdem, was es erkennt. Die Ausgabetypen, die es ausgibt, sind:
SecurityCheck-XSSSecurityCheck-SQLInjectionSecurityCheck-ShellInjectionSecurityCheck-PHPSerializeInjection - Denn wenn jemand unserialize( $_GET['d'] ); Dieser Ausgabetyp scheint derzeit eine hohe falsch positive Rate zu haben.SecurityCheck-CUSTOM1 - Damit Menschen benutzerdefinierte maßgeschneiderte Typen haben könnenSecurityCheck-CUSTOM2 - ditoSecurityCheck-DoubleEscaped - Erkennen, dass HTML doppelt entkommen wirdSecurityCheck-RCE - Remote -Code -Ausführung, z. eval( $_GET['foo'] )SecurityCheck-PathTraversal - Path -Traversal, z. B. require $_GET['foo']SecurityCheck-ReDoS - Regelmäßiger Ausdruck Denial of Service (Redos), z preg_match( $_GET['foo'], 'foo')SecurityCheck-LikelyFalsePositive - Ein potenzielles Problem, aber wahrscheinlich nicht. Meistens passiert, wenn das Plugin verwirrt wird. Das Schweregradfeld ist normalerweise als Issue::SEVERITY_NORMAL (5) . Fehlalarme Aspekte machen Issue::SEVERITY_LOW (0) . Probleme, die zu Serverkompromissen führen können (im Gegensatz zu nur Endbenutzer Kompromisse) wie Shell- oder SQL -Injektion als Issue::SEVERITY_CRITICAL (10) . Serialisierungsinjektion wäre normalerweise "kritisch", aber sie ist derzeit als Schweregrad der Normalen bezeichnet, da die Schecks im Moment eine hohe falsch positive Rate zu haben scheint.
Sie können die Befehlszeilenoption von -y von Phan verwenden, um nach Schweregrad zu filtern.
Wenn Sie ein falsches Positiv unterdrücken müssen, können Sie für eine Funktion/Methode @suppress NAME-OF-WARNING in den DocBlock einfügen. Alternativ können Sie andere Arten von Unterdrückung wie @phan-suppress-next-line verwenden. Eine vollständige Liste finden Sie in Phans Readme. Der Abschnitt @param-taint und @return-taint (siehe "Anpassung") sind auch sehr nützlich, um mit falsch positiven Positiven umzugehen.
Beachten Sie, dass das Plugin mögliche XSS -Schwachstellen im CLI -Kontext meldet. Um sie zu vermeiden, können Sie SecurityCheck-XSS -Datei mit @phan-file-suppress in CLI-Skripten oder für die gesamte Anwendung (mit der Option " suppress_issue_types ) oder für die gesamte Anwendung) unterdrücken, wenn die Anwendung nur aus CLI-Skripten besteht. Wenn Sie aus einer internen Funktion alle Ausgaben ausgeben, können Sie @param-taint wie folgt verwenden:
/**
* @param-taint $stuffToPrint none
*/
public function printMyStuff ( string $ stuffToPrint ) {
echo $ stuffToPrint ;
}Wenn Sie Sicherheitsprobleme debuggen, können Sie:
'@phan-debug-var-taintedness $varname';
Dadurch wird ein Problem SecurityCheckDebugTaintedness ausgestrahlt, das die Verfälschung von $varname in der Linie enthält, in der die Annotation gefunden wird. Beachten Sie, dass Sie die Annotation in ein Saitenliteral einfügen müssen. Kommentare werden nicht funktionieren. Siehe auch Phans @phan-debug-var Annotation.
@return-taint html zu markieren.$options ) und den sechsten ( $join_cond ) der IDatabase::select() von Mediawiki validieren, wenn es direkt als Array -Literal bereitgestellt oder direkt als Array -Literal aus einer getQueryInfo() -Methode zurückgegeben wird. Das Plugin unterstützt die Anpassung, indem die SecurityCheckplugin -Klasse unterklassikte. Für ein komplexes Beispiel dafür siehe MediaWikisecurityCheckplugin.
Manchmal haben Sie Methoden in Ihrer Codebasis, die den Makel einer Variablen verändern. Beispielsweise sollte eine benutzerdefinierte HTML -Fluchtfunktion das HTML -Taint -Bit löschen. In ähnlicher Weise kann Phan-Taint-Check manchmal verwirrt werden und Sie möchten den für eine bestimmten Funktion berechneten Makel überschreiben.
Sie können dies tun, indem Sie in einem Docblock -Kommentar eine Makelsanweisung hinzufügen. Zum Beispiel:
/**
* My function description
*
* @param string $html the text to be escaped
* @param-taint $html escapes_html
*/
function escapeHtml ( $ html ) {
}Methoden erben diese Richtlinien auch von abstrakten Definitionen in Ankunftsoberflächen, jedoch nicht aus konkreten Implementierungen in Vorfahren.
Taint-Richtlinien werden entweder mit @param-taint $parametername oder @return-taint vorangestellt. Wenn es mehrere Anweisungen gibt, können sie durch ein Komma getrennt werden. @param-taint wird verwendet, um entweder zu markieren, wie Makel aus dem Parameter auf den Methodenrend-Wert übertragen wird, oder wenn sie mit exec_ Anweisungen verwendet werden, um Orte zu markieren, an denen Parameter ausgegeben/ausgeführt werden. @return-taint wird verwendet, um den Mächtigen des Rückgabewerts unabhängig von den Eingabeparametern anzupassen.
Die Art der Anweisungen umfasst:
exec_$TYPE - Wenn ein Parameter als exec_$TYPE markiert ist, führt das Fütterung dieses Parameters einen Wert mit $TYPE Taint zu einer Warnung aus, die ausgelöst wird. Normalerweise verwenden Sie dies, wenn eine Funktion, die ihren Parameter ausgibt oder ausführtescapes_$TYPE - Wird für Parameter verwendet, bei denen die Funktion entkommt und dann den Parameter zurückgibt. Also würde es escapes_sql das SQL -Taint -Bit löschen, aber andere verdammte Bits in Ruhe lassen.onlysafefor_$TYPE - Für die Verwendung in @return-taint markiert der Rückgabetyp für einen bestimmten $TYPE , aber für die anderen Typen unsicher.$TYPE - Wenn nur der Typ in einem Parameter angegeben ist, ist er bitwisiert und mit der Eingabevariablenmacht. Normalerweise möchten Sie dies nicht tun, können aber nützlich sein, wenn $TYPE none angibt, dass der Parameter nicht zur Generierung des Rückgabewerts verwendet wird. In einem @return kann dies verwendet werden, um aufzumerieren, welche verdichteten Flaggen den Rückgabewert haben, was normalerweise nur nützlich ist, wenn es als tainted angegeben ist, um zu sagen, dass er alle Flaggen hat.array_ok - Spezialzweckflagge zu sagen, ignorieren Sie verdorbene Argumente, wenn sie sich in einem Array befinden.allow_override -Spezialzweckflagge, um anzugeben, dass diese gemütliche Annotation von Phan-Taint-Check überschrieben werden sollte, wenn sie einen bestimmten Makel erkennen kann. Der Wert für $TYPE kann einer von htmlnoent , html , sql , shell , serialize , custom1 , custom2 , code , path , regex , sql_numkey , escaped , none , tainted , verfälscht sein. Die meisten davon sind verdammte Kategorien, außer:
htmlnoent - wie html , aber deaktivieren Sie die doppelte Fluchtdetektion, die mit html verwendet wird. Wenn escapes_html angegeben wird, wird entkommen, dass entkommen wird automatisch zu @return hinzugefügt, und exec_escaped wird @param hinzugefügt. In ähnlicher Weise entspricht onlysafefor_html onlysafefor_htmlnoent,escaped .none - bedeutet kein Mühetainted - bedeutet alle verdichteten Kategorien mit Ausnahme von speziellen Kategorien (entspricht SecurityCheckPlugin::YES_TAINT )escaped - wird verwendet, um zu bedeuten, dass der Wert bereits entkommen ist (um die doppelte Flucht zu verfolgen)sql_numkey - ist für Mediawiki ziemlich besonderer Zweck. Es ignoriert Mächte in Arrays, wenn sie für assoziative Schlüssel sind. Der Standardwert für @param-taint wird tainted wenn es sich um eine Zeichenfolge (oder einen anderen gefährlichen Typ) handelt, und none , wenn es sich um eine Ganzzahl handelt. Der Standardwert für @return-taint ist allow_override (was nicht zu none entspricht, es sei denn, etwas Besseres kann autodetiert werden).
Anstatt Methoden in Ihrer Codebasis zu kommunizieren, können Sie auch Phan-Taint-Check so anpassen, dass sie Kenntnisse über Methodenverschmutzungen haben. Außerdem können Sie das Plugin so erweitern, dass sie ein ziemlich willkürliches Verhalten haben.
Dazu überschreiben Sie die Methode getCustomFuncTaints() . Diese Methode gibt ein assoziatives Array vollständig qualifizierter Methodennamen in ein Array zurück, das beschreibt, wie der Makel des Rückgabewerts der Funktion in Bezug auf ihre Argumente. Die numerischen Schlüssel entsprechen der Anzahl eines Arguments, und ein "Gesamt" -Staste fügt einen Makel hinzu, der in keinem der Argumente vorhanden ist. Grundsätzlich nimmt das Plugin für jedes Argument den Makel des Arguments, bitweise und es zu seinem Eintrag in das Array, und dann bitweise oder die Gesamtschlüssel. Wenn einer der Schlüssel im Array ein EXEC -Flag hat, wird sofort ein Problem angesprochen, wenn die entsprechende Mühe mit der Funktion (z. B. einer Ausgabefunktion) gefüttert wird. Die EXEC -Flaggen funktionieren nicht in der Gesamtschlüssel.
Zum Beispiel würde HTMLSpecialChars, die HTML -Taint beseitigen, seinem Argument entgeht und zurückgibt, wie der entkommene Wert aussehen würde:
' htmlspecialchars ' => [
( self :: YES_TAINT & ~ self :: HTML_TAINT ) | self :: ESCAPED_EXEC_TAINT ,
' overall ' => self :: ESCAPED ,
];Die folgenden Umgebungsvariablen wirken sich auf das Plugin aus. Normalerweise müssten Sie diese nicht anpassen.
SECURITY_CHECK_EXT_PATH - Pfad zum Verzeichnis, das extension.json / skin.json im Medienwiki -Modus enthält. Wenn nicht festgelegt wird das Projektroot -Verzeichnis.SECCHECK_DEBUG - Datei zur Ausgabe zusätzlicher Debug -Informationen (wenn aus shell , /dev/stderr ausgeführt wird, ist bequem). GNU Allgemeine öffentliche Lizenz, Version 2 oder später