Ini adalah plugin untuk Phan untuk mencoba dan mendeteksi masalah keamanan (seperti XSS). Ini melacak kapan saja pengguna dapat memodifikasi variabel, dan memeriksa untuk melihat bahwa variabel tersebut diloloskan sebelum menjadi output sebagai HTML atau digunakan sebagai kueri SQL, dll.
Ini mendukung proyek PHP generik, dan juga memiliki mode khusus untuk kode MediaWiki (menganalisis kait, HTMLForms dan metode basis data).
Demo web tersedia.
$ composer require --dev mediawiki/phan-taint-check-plugin
Plugin dapat digunakan dalam mode "manual" dan "mandiri". Yang pertama adalah pilihan terbaik jika proyek Anda sudah menjalankan Phan, dan hampir tidak ada konfigurasi yang diperlukan. Yang terakhir hanya boleh digunakan jika Anda tidak ingin menambahkan phan ke proyek Anda, dan tidak didukung untuk kode terkait MediaWiki. Untuk informasi lebih lanjut tentang penggunaan plugin ini Wikimedia, lihat https://www.mediawiki.org/wiki/phan-taint-check-plugin.
Anda hanya perlu menambahkan periksa noda ke bagian plugins konfigurasi phan Anda. Dengan asumsi bahwa periksa noda ada di lokasi vendor standar, misalnya $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; , file yang akan disertakan adalah "$seccheckPath/GenericSecurityCheckPlugin.php" untuk proyek generik, dan "$seccheckPath/MediaWikiSecurityCheckPlugin.php" untuk proyek MediaWiki.
Juga, pastikan bahwa mode cepat dinonaktifkan, atau plugin tidak akan berfungsi:
' quick_mode ' => false Anda juga harus menambahkan SecurityCheck-LikelyFalsePositive dan SecurityCheck-PHPSerializeInjection ke suppress_issue_types (yang terakhir memiliki tingkat positif palsu yang tinggi).
Kemudian jalankan Phan seperti biasanya:
$ vendor/bin/phan -d . --long-progress-bar
Menjalankan phan dengan --analyze-twice akan menangkap masalah keamanan tambahan yang mungkin tidak diperhatikan dalam fase analisis normal. Keterbatasan yang diketahui adalah bahwa masalah yang sama dapat dilaporkan lebih dari sekali dengan garis penyebab yang berbeda.
Anda dapat menjalankan periksa noda melalui:
$ ./vendor/bin/seccheck
Anda mungkin ingin menambahkan alias skrip komposer untuk itu:
"scripts" : {
"seccheck" : " seccheck "
}Perhatikan bahwa positif palsu dinonaktifkan secara default.
Plugin akan menghasilkan berbagai jenis masalah tergantung pada apa yang dideteksi. Masalahnya mengetikkan outputnya adalah:
SecurityCheck-XSSSecurityCheck-SQLInjectionSecurityCheck-ShellInjectionSecurityCheck-PHPSerializeInjection - karena ketika seseorang melakukan unserialize( $_GET['d'] ); Jenis masalah ini tampaknya memiliki tingkat positif palsu yang tinggi saat ini.SecurityCheck-CUSTOM1 - untuk memungkinkan orang memiliki jenis noda khususSecurityCheck-CUSTOM2 - DittoSecurityCheck-DoubleEscaped - Mendeteksi bahwa HTML sedang diloloskan gandaSecurityCheck-RCE - Eksekusi Kode Jarak Jauh, misalnya eval( $_GET['foo'] )SecurityCheck-PathTraversal - Path Traversal, misalnya require $_GET['foo']SecurityCheck-ReDoS - penolakan ekspresi reguler (redos), misalnya preg_match( $_GET['foo'], 'foo')SecurityCheck-LikelyFalsePositive - masalah potensial, tetapi mungkin tidak. Sebagian besar terjadi ketika plugin menjadi bingung. Bidang keparahan biasanya ditandai sebagai Issue::SEVERITY_NORMAL (5) . False Positif mendapatkan Issue::SEVERITY_LOW (0) . Masalah yang dapat mengakibatkan kompromi server (berbeda dengan kompromi pengguna akhir) seperti injeksi shell atau SQL ditandai sebagai Issue::SEVERITY_CRITICAL (10) . Serialisasi ulang biasanya akan "kritis" tetapi saat ini dilambangkan sebagai tingkat keparahan normal karena cek tampaknya memiliki tingkat positif palsu yang tinggi saat ini.
Anda dapat menggunakan opsi baris perintah -y phan untuk memfilter dengan tingkat keparahan.
Jika Anda perlu menekan false positive, Anda dapat menempatkan @suppress NAME-OF-WARNING di docBlock untuk suatu fungsi/metode. Atau, Anda dapat menggunakan jenis penindasan lain, seperti @phan-suppress-next-line . Lihat Readme Phan untuk daftar lengkap. Bagian @param-taint dan @return-taint (lihat "Kustomisasi") juga sangat berguna untuk berurusan dengan positif palsu.
Perhatikan bahwa plugin akan melaporkan kemungkinan kerentanan XSS dalam konteks CLI. Untuk menghindarinya, Anda dapat menekan file SecurityCheck-XSS dengan @phan-file-suppress dalam skrip CLI, atau untuk seluruh aplikasi (menggunakan opsi konfigurasi suppress_issue_types ) jika aplikasi hanya terdiri dari skrip CLI. Atau, jika semua output terjadi dari fungsi internal, Anda dapat menggunakan @param-taint sebagai berikut:
/**
* @param-taint $stuffToPrint none
*/
public function printMyStuff ( string $ stuffToPrint ) {
echo $ stuffToPrint ;
}Saat men -debug masalah keamanan, Anda dapat menggunakan:
'@phan-debug-var-taintedness $varname';
Ini akan memancarkan masalah SecurityCheckDebugTaintedness yang berisi noda $varname di garis di mana anotasi ditemukan. Perhatikan bahwa Anda harus memasukkan anotasi ke dalam string literal; Komentar tidak akan berhasil. Lihat juga Anotasi Phan @phan-debug-var .
@return-taint html .$options ) dan keenam ( $join_cond ) dari IDatabase::select() jika disediakan secara langsung sebagai array literal, atau langsung dikembalikan sebagai array literal dari metode getQueryInfo() . Plugin ini mendukung yang disesuaikan, dengan mensubklassing kelas SecurityCheckplugin. Untuk contoh kompleks melakukannya, lihat MediaWikisecurityCheckplugin.
Terkadang Anda memiliki metode dalam basis kode Anda yang mengubah noda variabel. Misalnya, fungsi pelarian HTML khusus harus menghapus bit noda HTML. Demikian pula, kadang-kadang check-nol dapat menjadi bingung dan Anda ingin mengesampingkan noda yang dihitung untuk fungsi tertentu.
Anda dapat melakukan ini dengan menambahkan arahan noda dalam komentar docblock. Misalnya:
/**
* My function description
*
* @param string $html the text to be escaped
* @param-taint $html escapes_html
*/
function escapeHtml ( $ html ) {
}Metode juga mewarisi arahan ini dari definisi abstrak dalam antarmuka leluhur, tetapi tidak dari implementasi konkret di kelas leluhur.
Arahan noda diawali dengan @param-taint $parametername atau @return-taint . Jika ada beberapa arahan, mereka dapat dipisahkan oleh koma. @param-taint digunakan untuk menandai bagaimana noda ditransmisikan dari parameter ke nilai metode pengembalian, atau ketika digunakan dengan arahan exec_ , untuk menandai tempat di mana parameter dikeluarkan/dieksekusi. @return-taint digunakan untuk menyesuaikan noda nilai pengembalian terlepas dari parameter input.
Jenis arahan meliputi:
exec_$TYPE - Jika parameter ditandai sebagai exec_$TYPE maka memberi makan parameter nilai dengan $TYPE naint akan menghasilkan peringatan yang dipicu. Biasanya Anda akan menggunakan ini saat fungsi yang mengeluarkan atau menjalankan parameternyaescapes_$TYPE - Digunakan untuk parameter di mana fungsi lolos dan kemudian mengembalikan parameter. Jadi escapes_sql akan menghapus bit noda SQL, tetapi meninggalkan bit noda lainnya sendirian.onlysafefor_$TYPE - untuk digunakan di @return-taint , menandai tipe pengembalian sebagai aman untuk $TYPE spesifik tetapi tidak aman untuk jenis lainnya.$TYPE - Jika hanya jenis yang ditentukan dalam parameter, itu bitwised dan dengan noda variabel input. Biasanya Anda tidak ingin melakukan ini, tetapi dapat berguna ketika $TYPE none untuk menentukan bahwa parameter tidak digunakan untuk menghasilkan nilai pengembalian. Dalam @return ini dapat digunakan untuk menyebutkan bendera noda mana yang dimiliki nilai pengembalian, yang biasanya hanya berguna ketika ditentukan sebagai tainted untuk mengatakan itu memiliki semua bendera.array_ok - Bendera tujuan khusus untuk mengatakan abaikan argumen yang tercemar jika mereka berada dalam array.allow_override -Bendera Tujuan Khusus untuk menentukan bahwa anotasi yang noda harus ditimpa oleh phan-nol-check jika dapat mendeteksi noda tertentu. Nilai untuk $TYPE dapat menjadi salah satu htmlnoent , html , sql , shell , serialize , custom1 , custom2 , code , path , regex , sql_numkey , escaped , none , tainted . Sebagian besar adalah kategori noda, kecuali:
htmlnoent - seperti html tetapi nonaktifkan deteksi pelarian ganda yang digunakan dengan html . Ketika escapes_html ditentukan, dilarikan secara otomatis ditambahkan ke @return , dan exec_escaped ditambahkan ke @param . Demikian pula onlysafefor_html yang setara dengan onlysafefor_htmlnoent,escaped .none - berarti tidak ada nodatainted - berarti semua kategori ternoda kecuali kategori khusus (setara dengan SecurityCheckPlugin::YES_TAINT )escaped - digunakan untuk berarti nilainya sudah melarikan diri (untuk melacak pelarian ganda)sql_numkey - adalah tujuan yang cukup khusus untuk MediaWiki. Itu mengabaikan noda dalam array jika mereka untuk kunci asosiatif. Nilai default untuk @param-taint tainted jika itu adalah string (atau tipe berbahaya lainnya), dan none jika itu seperti bilangan bulat. Nilai default untuk @return-taint adalah allow_override (yang setara dengan none kecuali sesuatu yang lebih baik dapat di-autodeteksi).
Alih-alih anotasi metode dalam basis kode Anda, Anda juga dapat menyesuaikan phan-nol-check untuk memiliki pengetahuan builtin tentang noda metode. Selain itu Anda dapat memperpanjang plugin untuk memiliki perilaku yang cukup sewenang -wenang.
Untuk melakukan ini, Anda mengganti metode getCustomFuncTaints() . Metode ini mengembalikan array asosiatif dari nama metode yang sepenuhnya memenuhi syarat ke array yang menjelaskan bagaimana noda nilai pengembalian fungsi dalam hal argumennya. Kunci numerik sesuai dengan jumlah argumen, dan kunci 'keseluruhan' menambah noda yang tidak ada dalam salah satu argumen. Pada dasarnya untuk setiap argumen, plugin mengambil noda argumen, bitwise dan itu untuk masuk dalam array, dan kemudian bitwise atau kunci keseluruhan. Jika salah satu kunci dalam array memiliki bendera eksekutif, maka masalah segera diangkat jika noda yang sesuai diberi makan fungsi (misalnya, fungsi output). Bendera eksekutif tidak berfungsi di kunci 'keseluruhan'.
Misalnya, htmlspecialchars yang menghilangkan noda html, lolos dari argumennya dan mengembalikan nilai yang dilarikan akan terlihat seperti:
' htmlspecialchars ' => [
( self :: YES_TAINT & ~ self :: HTML_TAINT ) | self :: ESCAPED_EXEC_TAINT ,
' overall ' => self :: ESCAPED ,
];Variabel lingkungan berikut mempengaruhi plugin. Biasanya Anda tidak perlu menyesuaikan ini.
SECURITY_CHECK_EXT_PATH - jalur ke direktori yang mengandung extension.json / skin.json saat dalam mode mediawiki. Jika tidak diatur dengan asumsi direktori root proyek.SECCHECK_DEBUG - File untuk mengeluarkan informasi debug tambahan (jika berjalan dari shell , /dev/stderr lebih nyaman) Lisensi Publik Umum GNU, versi 2 atau lebih baru