
أداة تحليل ثابت لتأمين كود Go
GoKart هي أداة تحليل ثابتة للغة Go تكتشف الثغرات الأمنية باستخدام شكل SSA (التعيين الثابت الفردي) لشفرة مصدر Go. وهي قادرة على تتبع مصدر المتغيرات ووسائط الدوال لتحديد ما إذا كانت مصادر الإدخال آمنة، مما يقلل من عدد النتائج الإيجابية الكاذبة مقارنة بأدوات فحص أمان Go الأخرى. على سبيل المثال، قد يتم الإبلاغ عن استعلام SQL الذي يتم ربطه بمتغير تقليدياً على أنه حقن SQL؛ ومع ذلك، يمكن لـGoKart معرفة ما إذا كان المتغير في الواقع ثابتاً أو مكافئاً لثابت، وفي هذه الحالة لا توجد ثغرة أمنية.
يساعد GoKart أيضاً في تشغيل Chariot، منصة Praetorian الأمنية التي تساعدك في العثور على الثغرات الأمنية في شفرتك المصدرية وبيئات السحابة وإدارتها وإصلاحها. يجعل Chariot من السهل تشغيل عمليات فحص GoKart تلقائية ومستمرة على شفرتك المصدرية. إذا كنت ترغب في تجربة GoKart، يمكنك إعداد حساب Chariot مجاني في دقائق عن طريق النقر هنا.
التحليل الثابت هو تقنية قوية لاكتشاف الثغرات الأمنية في الشفرة المصدرية. ومع ذلك، عانت هذه الطريقة من الضوضاء - أي أن العديد من أدوات التحليل الثابت تجد عدداً لا بأس به من "الثغرات" التي ليست حقيقية في الواقع. أدى هذا إلى احتكاك بين المطورين حيث يتعب المستخدمون من الأدوات التي "تصيح بالذئب" مرة تلو الأخرى.
كان الدافع وراء GoKart هو معالجة هذا الأمر: هل يمكننا إنشاء ماسح ضوئي بمعدلات نتائج إيجابية كاذبة أقل بكثير من الأدوات الحالية؟ بناءً على تجاربنا الإجابة هي نعم. من خلال الاستفادة من تتبع المصدر إلى المصب وSSA، فإن GoKart قادر على تتبع تلوث المتغيرات بين تعيينات المتغيرات، مما يحسن بشكل كبير من دقة النتائج. تركيزنا ينصب على سهولة الاستخدام: عملياً، هذا يعني أننا قمنا بتحسين طرقنا لتقليل الإنذارات الكاذبة.
لمزيد من المعلومات، يرجى قراءة مقالنا على المدونة.
يمكنك تثبيت GoKart محلياً باستخدام أي من الخيارات المدرجة أدناه.
go install$ go install github.com/praetorian-inc/gokart@latest
قم بتنزيل الملف الثنائي الخاص بنظام التشغيل الخاص بك من صفحة الإصدارات.
(اختياري) قم بتنزيل ملف checksums.txt للتحقق من سلامة الأرشيف
# التحقق من المجموع الاختباري للأرشيف الذي تم تنزيله
$ shasum -a 256 gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ cat gokart_${VERSION}_${ARCH}_checksums.txt | grep gokart_${VERSION}_${ARCH}.tar.gz
b05c4d7895be260aa16336f29249c50b84897dab90e1221c9e96af9233751f22 gokart_${VERSION}_${ARCH}.tar.gz
$ tar -xvf gokart_${VERSION}_${ARCH}.tar.gz
gokart إلى مسارك:$ mv ./gokart /usr/local/bin/
# استنساخ مستودع GoKart
$ git clone https://github.com/praetorian-inc/gokart.git
# انتقل إلى دليل المستودع وقم بالبناء
$ cd gokart
$ go build
# انقل الملف الثنائي gokart إلى مسارك
$ mv ./gokart /usr/local/bin
قم ببناء صورة Docker
docker build -t gokart .
تشغيل الحاوية مع فحص محلي (يجب تركيب دليل الفحص المحلي على صورة الحاوية)
docker run -v /path/to/scan-dir:/scan-dir gokart scan /scan-dir
تشغيل الحاوية مع فحص عن بُعد (عند تحديد مفتاح خاص للمصادقة، يجب أيضًا تركيبه على الحاوية)
docker run gokart scan -r https://github.com/praetorian-inc/gokart
# تحديد مفتاح خاص لمصادقة ssh للمستودعات الخاصة
docker run -v /path/to/key-dir/:/key-dir gokart scan -r [email protected]:praetorian-inc/gokart.git -k /key-dir/ssh_key
# التشغيل دون تحديد دليل يجعله يستخدم '.' بشكل افتراضي
gokart scan <flags>
gokart scan <directory> <flags>
gokart help
يمكنك اتباع الخطوات أدناه لتشغيل GoKart على Go Test Bench، وهو تطبيق Go ضعيف عن قصد من فريق Contrast Security.
# استنساخ التطبيق الضعيف المثال
git clone https://github.com/Contrast-Security-OSS/go-test-bench.git
gokart scan go-test-bench/
يجب أن يظهر الإخراج بعض الثغرات الأمنية المحددة، كل منها يحتوي على دالة ضعيفة ومصدر إدخال مستخدم محدد.
لاختبار بعض ميزات GoKart الإضافية، يمكنك الفحص باستخدام أعلام سطر الأوامر المقترحة أدناه.
# استخدام علم verbose لإظهار التتبع الكامل لهذه الثغرات الأمنية
gokart scan go-test-bench/ -v
# استخدام علم globalsTainted لتجاهل المصادر النظيفة في القائمة البيضاء
# قد يزيد من النتائج الإيجابية الكاذبة
gokart scan go-test-bench/ -v -g
# استخدام علم debug لعرض معلومات التحليل الداخلية
# المفيدة للتطوير وتصحيح الأخطاء
gokart scan go-test-bench/ -d
# إخراج النتائج بتنسيق sarif
gokart scan go-test-bench/ -s
# إخراج النتائج إلى ملف
gokart scan go-test-bench/ -o gokart-go-test-bench.txt
# إخراج نتائج scarif إلى ملف
gokart scan go-test-bench/ -o gokart-go-test-bench.txt -s
# فحص مستودع عام عن بُعد
# سيتم استنساخ المستودع محلياً وفحصه وحذفه بعد ذلك
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -v
# تحديد الفرع البعيد لفحصه
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -b actions_fix
# فحص مستودع خاص عن بُعد عبر ssh
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git
# فحص مستودع خاص عن بُعد وتحديد مفتاح لمصادقة ssh اختيارياً
gokart scan -r [email protected]:Contrast-Security-OSS/go-test-bench.git -k /home/gokart/.ssh/github_rsa_key
# استخدام أعلام الفحص عن بُعد والإخراج معاً لمراجعات أمنية سلسة
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -v
# استخدام أعلام الفحص عن بُعد والإخراج وsarif للتكامل السلس مع CI/CD
gokart scan -r https://github.com/ShiftLeftSecurity/shiftleft-go-demo -o gokart-shiftleft-go-demo.txt -s
لاختبار قابلية توسيع GoKart، يمكنك تعديل ملف التكوين الذي يستخدمه GoKart لإدخال
مصب ضعيف جديد في التحليل. يوجد محلل اختبار مصب (Test Sink) معرف في ملف التكوين الافتراضي المضمن
في util/analyzers.yml. قم بتعديل util/analyzers.yml لإزالة التعليقات على
محلل Test Sink ثم قم بتوجيه GoKart لاستخدام ملف التكوين المعدل باستخدام العلم -i.
# الفحص باستخدام ملف analyzers.yml المعدل وإخراج التتبع الكامل
gokart scan go-test-bench/ -v -i <path-to-gokart>/util/analyzers.yml
يجب أن يحتوي الإخراج الآن على ثغرات أمنية إضافية، بما في ذلك ثغرات جديدة "Test Sink reachable by user input".
يمكنك تشغيل الاختبارات المضمنة باستخدام الأمر التالي، مع التشغيل من الدليل الجذر لـGoKart.
go test -v ./...