تفقد رمز المصدر لمشاكل الأمان عن طريق مسح تمثيل رمز GO AST و SSA.
مرخصة بموجب ترخيص Apache ، الإصدار 2.0 ("الترخيص"). لا يجوز لك استخدام هذا الملف إلا في الامتثال للترخيص. يمكنك الحصول على نسخة من الترخيص هنا.
# binary will be $(go env GOPATH)/bin/gosec
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s -- -b $( go env GOPATH ) /bin vX.Y.Z
# or install it into ./bin/
curl -sfL https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# In alpine linux (as it does not come with curl by default)
wget -O - -q https://raw.githubusercontent.com/securego/gosec/master/install.sh | sh -s vX.Y.Z
# If you want to use the checksums provided on the "Releases" page
# then you will have to download a tar.gz file for your operating system instead of a binary file
wget https://github.com/securego/gosec/releases/download/vX.Y.Z/gosec_vX.Y.Z_OS.tar.gz
# The file will be in the current folder where you run the command
# and you can check the checksum like this
echo " <check sum from the check sum file> gosec_vX.Y.Z_OS.tar.gz " | sha256sum -c -
gosec --help يمكنك تشغيل gosec كعمل github على النحو التالي:
name : Run Gosec
on :
push :
branches :
- master
pull_request :
branches :
- master
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
args : ./...يمكنك دمج أدوات تحليل رمز الجهات الخارجية مع مسح رمز Github عن طريق تحميل البيانات كملفات SARIF.
يعرض سير العمل مثالًا لتشغيل gosec كخطوة في سير عمل GitHub الذي يخرج ملف results.sarif . يقوم سير العمل بعد ذلك بتحميل results.sarif upload-sarif
name : " Security Scan "
# Run workflow each time code is pushed to your repository and on a schedule.
# The scheduled workflow runs every at 00:00 on Sunday UTC time.
on :
push :
schedule :
- cron : ' 0 0 * * 0 '
jobs :
tests :
runs-on : ubuntu-latest
env :
GO111MODULE : on
steps :
- name : Checkout Source
uses : actions/checkout@v3
- name : Run Gosec Security Scanner
uses : securego/gosec@master
with :
# we let the report trigger content trigger a failure using the GitHub Security features.
args : ' -no-fail -fmt sarif -out results.sarif ./... '
- name : Upload SARIF file
uses : github/codeql-action/upload-sarif@v2
with :
# Path to SARIF file relative to the root of the repository
sarif_file : results.sarifgo install github.com/securego/gosec/v2/cmd/gosec@latest يمكن تكوين GOSEC لتشغيل مجموعة فرعية فقط من القواعد ، لاستبعاد مسارات الملفات ، وإنتاج تقارير بتنسيقات مختلفة. بشكل افتراضي ، سيتم تشغيل جميع القواعد مقابل ملفات الإدخال المقدمة. للمسح الضوئي بشكل متكرر من الدليل الحالي ، يمكنك توفير ./... كوسيطة إدخال.
بشكل افتراضي ، ستقوم GoSec بتشغيل جميع القواعد مقابل مسارات الملفات المقدمة. ومع ذلك ، من الممكن تحديد مجموعة فرعية من القواعد التي يتم تشغيلها عبر -include= flag ، أو لتحديد مجموعة من القواعد لاستبعادها بشكل صريح باستخدام -exclude= flag.
# Run a specific set of rules
$ gosec -include=G101,G203,G401 ./...
# Run everything except for rule G303
$ gosec -exclude=G303 ./... يتم تعيين كل قضية تم اكتشافها بواسطة gosec إلى CWE (تعداد الضعف الشائع) الذي يصف بعبارات أكثر عامة الضعف. يمكن العثور على رسم الخرائط الدقيقة هنا.
يمكن توفير عدد من الإعدادات العالمية في ملف التكوين على النحو التالي:
{
"global" : {
"nosec" : " enabled " ,
"audit" : " enabled "
}
}nosec : هذا الإعداد سوف يكتب كل توجيهات #nosec المحددة في قاعدة الكودaudit : يعمل في وضع التدقيق الذي يتيح التحقق من الإضافة أنه قد يكون لتحليل الكود العادي فضوليًا جدًا # Run with a global configuration file
$ gosec -conf config.json . بعض القواعد تقبل أعلام التكوين أيضًا ؛ تم توثيق هذه الأعلام في القواعد.
تتطلب بعض القواعد إصدارًا محددًا يتم استرداده من ملف وحدة GO الموجود في المشروع. إذا لم يكن من الممكن العثور على هذا الإصدار ، فسيتم تراجع إصدار وقت التشغيل.
يتم تحليل إصدار وحدة GO باستخدام أمر go list الذي قد يؤدي في بعض الحالات إلى تدهور الأداء. في هذه الحالة ، يمكن توفير إصدار وحدة GO بسهولة عن طريق تعيين متغير البيئة GOSECGOVERSION=go1.21.1 .
ستجلب GOSEC تلقائيًا تبعيات الكود التي يتم تحليلها عند تشغيل وحدة GO (على سبيل المثال GO111MODULE=on ). إذا لم يكن هذا هو الحال ، فيجب تنزيل التبعيات بشكل صريح عن طريق تشغيل أمر go get -d قبل المسح.
ستتجاهل GoSec ملفات الاختبار عبر جميع الحزم وأي تبعيات في دليل البائع الخاص بك.
يمكن تمكين مسح ملفات الاختبار بالعلم التالي:
gosec -tests ./...كما يمكن استبعاد المجلدات الإضافية على النحو التالي:
gosec -exclude-dir=rules -exclude-dir=cmd ./...يمكن لـ GOSEC تجاهل ملفات GO التي تم إنشاؤها مع تعليق التعليمات البرمجية الافتراضية.
// Code generated by some generator DO NOT EDIT.
gosec -exclude-generated ./...يمكن أن يقترح GoSec إصلاحات بناءً على توصية الذكاء الاصطناعي. سوف يطلق على واجهة برمجة تطبيقات AI لتلقي اقتراح لاكتشاف الأمن.
يمكنك تمكين هذه الميزة من خلال توفير وسيطات سطر الأوامر التالية:
ai-api-provider : اسم مزود AI AI ، حاليًا يتم دعم gemini فقط.ai-api-key أو اضبط متغير البيئة GOSEC_AI_API_KEY : المفتاح للوصول إلى AI AI ، من أجل الجوزاء ، يمكنك إنشاء مفتاح API باتباع هذه التعليمات.ai-endpoint : نقطة النهاية لمزود الذكاء الاصطناعي ، هذه وسيطة اختيارية. gosec -ai-api-provider= " gemini " -ai-api-key= " your_key " ./... كما هو الحال مع جميع أدوات الكشف الآلية ، ستكون هناك حالات إيجابيات كاذبة. في الحالات التي يبلغ فيها GoSec عن الفشل الذي تم التحقق منه يدويًا باعتباره آمنًا ، من الممكن التعليق على الرمز مع تعليق يبدأ بـ #nosec .
يجب أن يكون للتعليق #nosec التنسيق #nosec [RuleList] [-- Justification] .
يجب وضع تعليق #nosec على الخط حيث يتم الإبلاغ عن التحذير.
func main () {
tr := & http. Transport {
TLSClientConfig : & tls. Config {
InsecureSkipVerify : true , // #nosec G402
},
}
client := & http. Client { Transport : tr }
_ , err := client . Get ( "https://go.dev/" )
if err != nil {
fmt . Println ( err )
}
} عندما يتم تحديد إيجابية خاطئة محددة والتحقق منها على أنها آمنة ، فقد ترغب في قمع تلك القاعدة الفردية فقط (أو مجموعة محددة من القواعد) ضمن قسم من الكود ، مع الاستمرار في المسح للمشاكل الأخرى. للقيام بذلك ، يمكنك سرد القاعدة (القواعد) المراد قمعها ضمن التعليق التوضيحي #nosec ، على سبيل المثال: /* #nosec G401 */ أو //#nosec G201 G202 G203
يمكنك وضع وصف الوصف أو التبرير للتعليق. يجب أن يكون المبرر بعد القاعدة (القواعد) لقمع وبدء شرطين أو أكثر ، على سبيل المثال: //#nosec G101 G102 -- This is a false positive
في بعض الحالات ، قد ترغب أيضًا في إعادة النظر في الأماكن التي تم فيها استخدام التعليقات التوضيحية #nosec . لتشغيل الماسح الضوئي وتجاهل أي ملاحظات #nosec يمكنك القيام بما يلي:
gosec -nosec=true ./... كما هو موضح أعلاه ، يمكننا قمع الانتهاكات خارجيًا (باستخدام -include / -exclude ) أو مضمّن (باستخدام التعليقات التوضيحية #nosec ) في GOSEC. يمكن استخدام التهاب القمع هذا لإنشاء إشارات مماثلة لأغراض التدقيق.
يمكننا تتبع الإقامة من خلال علم -track-suppressions على النحو التالي:
gosec -track-suppressions -exclude=G101 -fmt=sarif -out=results.sarif ./...kind external justification هو جملة معينة "مكبوتة عالميًا".kind هو inSource justification هو النص بعد اثنين أو أكثر من شرطات في التعليق.ملاحظة: تدعم تنسيقات SARIF و JSON فقط قمع تتبع.
GoSec قادر على تمرير علامات إنشاء GO الخاصة بك إلى المحلل. يمكن توفيرها كقائمة مفصولة فاصلة على النحو التالي:
gosec -tags debug,ignore ./... يدعم GoSec حاليًا text و json و yaml و csv و sonarqube و JUnit XML و html و golint . سيتم الإبلاغ عن النتائج الافتراضية إلى STDOUT ، ولكن يمكن أيضًا كتابتها إلى ملف الإخراج. يتم التحكم في تنسيق الإخراج بواسطة علامة -fmt ، ويتم التحكم في ملف الإخراج بواسطة علامة -out على النحو التالي:
# Write output in json format to results.json
$ gosec -fmt=json -out=results.json * .go سيتم الإبلاغ عن النتائج إلى stdout وكذلك إلى ملف الإخراج المقدم بواسطة علامة -stdout . يتجاوز علامة -verbose تنسيق الإخراج عند stdout النتائج أثناء حفظها في ملف الإخراج
# Write output in json format to results.json as well as stdout
$ gosec -fmt=json -out=results.json -stdout * .go
# Overrides the output format to 'text' when stdout the results, while writing it to results.json
$ gosec -fmt=json -out=results.json -stdout -verbose=text * .go ملاحظة: تقوم GoSec بإنشاء تنسيق استيراد القضية العام لـ Sonarqube ، ويجب استيراد تقرير إلى Sonarqune باستخدام sonar.externalIssuesReportPaths=path/to/gosec-report.json .
المساهمة. MD يحتوي على معلومات مفصلة حول إضافة قواعد جديدة إلى GoSec.
يمكنك بناء الثنائي مع:
makeتثبيت الأداة مع:
go get -u github.com/a-h/generate/cmd/schema-generateثم قم بإنشاء الأنواع مع:
schema-generate -i sarif-schema-2.1.0.json -o mypath/types.goتتم إزالة معظم Marshalljson/Unmarshaljson باستثناء تلك الخاصة بـ PropertyBag والتي هي في متناول اليد لتضمين الخصائص الإضافية. يمكن إزالة الباقي. تم إعادة تسمية URI ، ID ، UUID ، GUID بحيث تناسب اتفاقية GO المحددة هنا
يمكنك تشغيل جميع اختبارات الوحدة باستخدام:
make testيمكنك إنشاء إصدار عن طريق وضع علامة على الإصدار على النحو التالي:
git tag v1.0.0 -m " Release version v1.0.0 "
git push origin v1.0.0يعمل سير عمل GitHub إصدار مباشرة بعد دفع العلامة في اتجاه المنبع. سيصدر هذا التدفق الثنائيات باستخدام إجراء GoreleAser ومن ثم سيقوم ببناء ونشر صورة Docker في Docker Hub.
يتم توقيع القطع الأثرية التي تم إصدارها باستخدام cosign. يمكنك استخدام المفتاح العام من ملف cosign.pub للتحقق من توقيع ملفات Docker وملفات الثنائيات.
يمكن التحقق من توقيع صورة Docker مع الأمر التالي:
cosign verify --key cosign.pub securego/gosec:<TAG>
يمكن التحقق من توقيع الملفات الثنائية مع الأمر التالي:
cosign verify-blob --key cosign.pub --signature gosec_<VERSION>_darwin_amd64.tar.gz.sig gosec_<VERSION>_darwin_amd64.tar.gz
يمكنك أيضًا بناء صورة Docker محليًا باستخدام الأمر:
make image يمكنك تشغيل أداة gosec في حاوية مقابل مشروع GO المحلي. عليك فقط تثبيت المشروع في وحدة تخزين كما يلي:
docker run --rm -it -w / < PROJECT > / -v < YOUR PROJECT PATH > / < PROJECT > :/ < PROJECT > securego/gosec / < PROJECT > /... ملاحظة: يجب تعيين دليل العمل الحالي مع خيار -w من أجل حل التبعيات بنجاح من ملف GO MODULE
يمكن إنشاء تكوين قاعدة TLS من توصية Mozilla TLS Ciphers.
تحتاج أولاً إلى تثبيت أداة المولد:
go get github.com/securego/gosec/v2/cmd/tlsconfig/... يمكنك استدعاء الآن go generate في جذر المشروع:
go generate ./... سيؤدي ذلك إلى إنشاء ملف rules/tls_config.go والذي سيحتوي على توصية CIPHERS الحالية من Mozilla.
هذه قائمة مع بعض مستخدمي GoSec.
دعم هذا المشروع من خلال أن يصبح راعياً. سيظهر شعارك هنا مع رابط لموقع الويب الخاص بك