هذا هو البرنامج المساعد لفان لمحاولة اكتشاف مشكلات الأمان (مثل XSS). يتتبع أي وقت يمكن للمستخدم تعديل متغير ، ويتحقق لترى أن مثل هذه المتغيرات تفلت قبل الإخراج كـ HTML أو استخدامها كاستعلام SQL ، إلخ.
وهو يدعم مشاريع PHP العامة ، كما أنه يحتوي على وضع مخصص لرمز MediaWiki (تحليل الخطافات ، HTMLForms وطرق قاعدة البيانات).
عرض ويب متاح.
$ composer require --dev mediawiki/phan-taint-check-plugin
يمكن استخدام البرنامج المساعد في كل من وضع "اليدوي" و "مستقل". السابق هو الخيار الأفضل إذا كان مشروعك يعمل بالفعل Phan ، ولم يكن هناك حاجة إلى تكوين تقريبًا. يجب استخدام الأخير فقط إذا كنت لا ترغب في إضافة Phan إلى مشروعك ، ولا يتم دعمه للرمز المتعلق بـ MediaWiki. لمزيد من المعلومات حول استخدام ويكيميديا لهذا البرنامج المساعد ، راجع https://www.mediawiki.org/wiki/phan-taint-check-plugin.
عليك ببساطة إضافة Taint-Check إلى قسم plugins من تكوين Phan الخاص بك. على افتراض أن Taint-check موجود في موقع البائع القياسي ، على سبيل المثال $seccheckPath = 'vendor/mediawiki/phan-taint-check-plugin/'; ، الملف الذي يجب تضمينه هو "$seccheckPath/GenericSecurityCheckPlugin.php" لمشروع عام ، و "$seccheckPath/MediaWikiSecurityCheckPlugin.php" لمشروع MediaWiki.
تأكد أيضًا من تعطيل الوضع السريع ، أو أن المكون الإضافي لن يعمل:
' quick_mode ' => false يجب عليك أيضًا إضافة SecurityCheck-LikelyFalsePositive و SecurityCheck-PHPSerializeInjection إلى suppress_issue_types (يحتوي الأخير على نسبة عالية من الإيجابيات الخاطئة).
ثم قم بتشغيل Phan كما تفعل عادة:
$ vendor/bin/phan -d . --long-progress-bar
سيؤدي تشغيل PHAN مع --analyze-twice إلى مشكلات أمنية إضافية قد تمر دون أن يلاحظها أحد في مرحلة التحليل العادي. أحد القيود المعروفة على ذلك هو أنه يمكن الإبلاغ عن نفس المشكلة أكثر من مرة مع خطوط مختلفة بسبب خطوط مختلفة.
يمكنك تشغيل 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 - TATH TARVERSAL ، على سبيل المثال 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) . عادةً ما يكون التسلسل التسلسلي "حرجًا" ، ولكن يُشار إليه حاليًا باعتباره شدة طبيعية لأن الشيك يبدو أن معدل إيجابي عالي في الوقت الحالي.
يمكنك استخدام خيار سطر الأوامر -y من Phan للتصفية حسب الخطورة.
إذا كنت بحاجة إلى قمع إيجابية خاطئة ، فيمكنك وضع @suppress NAME-OF-WARNING في الدكتوراه في دالة/طريقة. بدلاً من ذلك ، يمكنك استخدام أنواع أخرى من القمع ، مثل @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's @phan-debug-var .
@return-taint html .$options ) والسادسة ( $join_cond ) من IDatabase::select() إذا تم توفيرها مباشرة كصفبة حرفية ، أو تم إرجاعها مباشرة كصفبة حرفية من طريقة getQueryInfo() . يدعم البرنامج المساعد تخصيص ، من خلال التصنيف الفرعي لفئة SecurityCheckPlugin. للحصول على مثال معقد على القيام بذلك ، انظر MediaWikisecurityCheckPlugin.
في بعض الأحيان يكون لديك أساليب في قاعدة الشفرة الخاصة بك والتي تغير من المتغير. على سبيل المثال ، يجب أن تقوم وظيفة هروب HTML المخصصة بمسح بتات HTML. وبالمثل ، يمكن في بعض الأحيان أن يتم الخلط بين الفان-تشيك ، وتريد تجاوز taint المحسوبة لوظيفة محددة.
يمكنك القيام بذلك عن طريق إضافة توجيه taint في تعليق 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 ، فإن تغذية هذه المعلمة قيمة مع taint $TYPE ستؤدي إلى تحذير. عادةً ما يمكنك استخدام هذا عندما تقوم دالة بإخراج أو تنفيذ معلمهاescapes_$TYPE - يستخدم للمعلمات حيث تفلت الوظيفة ثم تُرجع المعلمة. لذا escapes_sql من شأنه أن يزيل SQL taint بت ، ولكن يترك أجزاء أخرى من الحنطة وحدها.onlysafefor_$TYPE - للاستخدام في @return-taint ، يمثل نوع الإرجاع آمنًا لنوع $TYPE محدد ولكن غير آمن للأنواع الأخرى.$TYPE - إذا تم تحديد النوع فقط في المعلمة ، فسيتم تعبئته ومع وجود متغير الإدخال. عادةً ما لا ترغب في القيام بذلك ، ولكن يمكن أن تكون مفيدة عندما لا يكون $TYPE none لتحديد أن المعلمة لا تستخدم لإنشاء قيمة الإرجاع. في @return يمكن استخدام هذا لتعداد الأعلام التي تتمتع بها قيمة الإرجاع ، والتي عادة ما تكون مفيدة فقط عند تحديدها على أنها tainted ليقول إنها تحتوي على جميع الأعلام.array_ok - علم الأغراض الخاصة أن نقول تجاهل الحجج الملوثة إذا كانت في صفيف.allow_override علامة الغرض الخاص لتحديد أن التعليقات التوضيحية التي يجب أن يتم تجاوزها من قبل الفان-تشيك إذا كان بإمكانها اكتشاف ملاءمة محددة. يمكن أن تكون القيمة $TYPE واحدة من htmlnoent ، html ، sql ، shell ، serialize ، custom1 ، custom2 ، code ، path ، regex ، sql_numkey ، escaped ، none ، tainted . معظم هذه الفئات taint ، باستثناء:
htmlnoent - مثل html ولكن تعطيل الكشف المزدوج الهروب الذي يعتاد مع html . عند تحديد escapes_html ، تتم إضافة هروب تلقائيًا إلى @return ، ويتم إضافة exec_escaped إلى @param . وبالمثل ، فإن onlysafefor_html يعادل فقط onlysafefor_htmlnoent,escaped .none - لا تعني أي تلوثtainted - يعني جميع الفئات المتوترة باستثناء الفئات الخاصة (أي ما يعادل SecurityCheckPlugin::YES_TAINT )escaped - يستخدم ليعني أن القيمة قد هربت بالفعل (لتتبع الهروب المزدوج)sql_numkey - هو غرض خاص إلى حد ما ل MediaWiki. يتجاهل taint في المصفوفات إذا كانت للمفاتيح الترابطية. تكون القيمة الافتراضية لـ @param-taint tainted إذا كانت سلسلة (أو نوع آخر خطير) ، none إذا كان ذلك مثل عدد صحيح. القيمة الافتراضية لـ @return-taint allow_override (وهو ما يعادل none ما لم يكن من الأفضل تحديد شيء أفضل).
بدلاً من تعليقات التعليق في قاعدة قاعدة البيانات الخاصة بك ، يمكنك أيضًا تخصيص CATET-CATED لتكوين المعرفة من TAINTS. بالإضافة إلى ذلك ، يمكنك تمديد البرنامج المساعد للحصول على سلوك تعسفي إلى حد ما.
للقيام بذلك ، يمكنك تجاوز طريقة getCustomFuncTaints() . تقوم هذه الطريقة بإرجاع مجموعة نقاطية من أسماء الأسلوب المؤهلة بالكامل إلى صفيف تصف كيف تتسخن قيمة الإرجاع للوظيفة من حيث وسيطاتها. تتوافق المفاتيح الرقمية مع عدد الوسيطة ، ويضيف مفتاح "شامل" غير موجود في أي من الوسائط. في الأساس لكل وسيطة ، يأخذ المكون الإضافي ملاءمة من الوسيطة ، وينه إلى دخوله في الصفيف ، ثم bitwise أو المفتاح العام. إذا كان لدى أي من المفاتيح في الصفيف أعلام exec ، فسيتم إثارة مشكلة على الفور إذا تم إطعام taint المقابل الوظيفة (على سبيل المثال ، وظيفة الإخراج). لا تعمل أعلام Exec في المفتاح "العام".
على سبيل المثال ، HTMLSpecialChars التي تزيل HTML Taint ، تفلت من حجتها وإرجاع القيمة الهاربة ستبدو:
' htmlspecialchars ' => [
( self :: YES_TAINT & ~ self :: HTML_TAINT ) | self :: ESCAPED_EXEC_TAINT ,
' overall ' => self :: ESCAPED ,
];تؤثر متغيرات البيئة التالية على البرنامج المساعد. عادة لن تضطر إلى ضبطها.
SECURITY_CHECK_EXT_PATH - مسار إلى الدليل يحتوي على extension.json / skin.json عندما في وضع MediaWiki. إذا لم يتم تعيين تفترض دليل جذر المشروع.SECCHECK_DEBUG - ملف لإخراج معلومات تصحيح إضافية (إذا كان يعمل من shell ، /dev/stderr مريحة) رخصة عامة عامة ، الإصدار 2 أو ما بعده