
مدقق أمان Go
يفحص الكود المصدري بحثًا عن مشاكل أمنية من خلال مسح تمثيل AST و SSA لكود Go.
مرخص بموجب رخصة أباتشي، الإصدار 2.0 ("الترخيص"). لا يجوز لك استخدام هذا الملف إلا بالامتثال للترخيص. يمكنك الحصول على نسخة من الترخيص هنا.
يمكنك تشغيل gosec كإجراء على GitHub كما يلي:
استخدم الوسم المُرقم مع @master المثبت على أحدث إصدار مستقر. سيوفر هذا سلوكًا مستقرًا.```yaml
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: ./...
#### فحص المشاريع ذات الوحدات الخاصة
إذا كان مشروعك يستورد وحدات Go خاصة، فأنت بحاجة إلى تكوين المصادقة حتى يتمكن `gosec` من جلب التبعيات. قم بتعيين متغيرات البيئة التالية في سير العمل الخاص بك:
- `GOPRIVATE`: قائمة مفصولة بفواصل من بادئات مسار الوحدة التي يجب اعتبارها خاصة
(على سبيل المثال، `github.com/your-org/*`).
- `GITHUB_AUTHENTICATION_TOKEN`: رمز GitHub مع صلاحية قراءة
لمستودعاتك الخاصة.```yaml
name: Run Gosec
on:
push:
branches:
- master
pull_request:
branches:
- master
jobs:
tests:
runs-on: ubuntu-latest
env:
GO111MODULE: on
GOPRIVATE: github.com/your-org/*
GITHUB_AUTHENTICATION_TOKEN: ${{ secrets.PRIVATE_REPO_TOKEN }}
steps:
- name: Checkout Source
uses: actions/checkout@v3
- name: Run Gosec Security Scanner
uses: securego/gosec@v2
with:
args: ./...
يمكنك دمج أدوات تحليل الكود من جهات خارجية مع فحص الكود في GitHub عن طريق تحميل البيانات كملفات SARIF.
يوضح سير العمل مثالًا على تشغيل gosec كخطوة
في سير عمل GitHub Action الذي يُنتج ملف results.sarif
ملف. يقوم سير العمل بعد ذلك برفع ملف results.sarif إلى
GitHub باستخدام إجراء upload-sarif.```yaml
name: "Security Scan"
on: push: schedule:
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@v2 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.sarif
### تحليل Go
توفر حزمة `goanalysis`
[`golang.org/x/tools/go/analysis.Analyzer`](https://pkg.go.dev/golang.org/x/tools/go/analysis)
للتكامل مع الأدوات التي تدعم Go القياسي
واجهة التحليل، مثل إطار Bazel's
[nogo](https://github.com/bazelbuild/rules_go/blob/master/go/nogo.rst)
إطار العمل:```starlark
nogo(
name = "nogo",
deps = [
"@com_github_securego_gosec_v2//goanalysis",
# add more analyzers as needed
],
visibility = ["//visibility:public"],
)
يتطلب gosec إصدار Go 1.25 أو أحدث.```bash go install github.com/securego/gosec/v2/cmd/gosec@latest
## بداية سريعة```bash
# Scan all packages in current module
gosec ./...
# Write JSON report
gosec -fmt json -out results.json ./...
# Write SARIF report for code scanning
gosec -fmt sarif -out results.sarif ./...
0: انتهى الفحص دون نتائج/أخطاء غير مكبوتة1: وجود نتيجة واحدة على الأقل غير مكبوتة أو خطأ في المعالجة-no-fail لإرجاع 0 دائمًايمكن تكوين Gosec لتشغيل مجموعة فرعية فقط من القواعد، لاستبعاد مسارات ملفات معينة، وإنتاج تقارير بتنسيقات مختلفة. بشكل افتراضي، سيتم تشغيل جميع القواعد على ملفات الإدخال المقدمة. للمسح بشكل متكرر من الدليل الحالي، يمكنك تقديم ./... كوسيطة إدخال.
تتضمن Gosec قواعد عبر هذه الفئات:
G1xx: مشكلات الترميز الآمن العامة (على سبيل المثال بيانات اعتماد مكتوبة بشكل ثابت، استخدام غير آمن، تقوية HTTP، أمان الكوكيز)G2xx: مخاطر الحقن في بناء الاستعلام/القالب/الأمرG3xx: مخاطر معالجة الملفات والمسارات (الأذونات، التجوال، الملفات المؤقتة، استخراج الأرشيف)G4xx: نقاط ضعف التشفير و TLSG5xx: واردات مدرجة في القائمة المحظورةG6xx: فحوصات الصحة/الأمان الخاصة بـ Go (على سبيل المثال، تسمية النطاق وحدود الشرائح)G7xx: قواعد تحليل التلوث (حقن SQL، حقن الأوامر، تجوال المسار، SSRF، XSS، السجل، حقن SMTP، SSTI، إلغاء التسلسل غير الآمن، وإعادة التوجيه المفتوحة)للحصول على القائمة الكاملة، أوصاف القواعد، والتكوين لكل قاعدة، انظر RULES.md.
بشكل افتراضي، ستقوم Gosec بتشغيل جميع القواعد على مسارات الملفات المقدمة. ومع ذلك، من الممكن تحديد مجموعة فرعية من القواعد لتشغيلها عبر علم -include=، أو تحديد مجموعة من القواعد لاستبعادها صراحة باستخدام علم -exclude=.```bash
$ gosec -include=G101,G203,G401 ./...
$ gosec -exclude=G303 ./...
### تعيين CWE
يتم تعيين كل مشكلة يتم اكتشافها بواسطة `gosec` إلى
[CWE (التعداد الضعيف الشائع)](http://cwe.mitre.org/data/index.html)
الذي يصف بشكل أكثر عمومية الثغرة. يمكن العثور على
التعيين الدقيق
[هنا](https://github.com/securego/gosec/blob/master/issue/issue.go#L50).
### التكوين
يمكن تقديم عدد من الإعدادات العامة في ملف
تكوين على النحو التالي:```JSON
{
"global": {
"nosec": "enabled",
"audit": "enabled"
}
}
nosec: سيؤدي هذا الإعداد إلى استبدال جميع توجيهات #nosec
المحددة في جميع أنحاء قاعدة الكودaudit: يعمل في وضع التدقيق الذي يتيح فحوصات إضافية
قد تكون مزعجة جداً لتحليل الكود العادي```bash$ gosec -conf config.json .
### استثناءات القواعد المستندة إلى المسار
قد تحتاج المستودعات الكبيرة ذات المكونات المتعددة إلى قواعد أمان مختلفة لمسارات مختلفة. استخدم `exclude-rules` لكبت قواعد محددة لمسارات محددة.
**ملف التهيئة:**```json
{
"exclude-rules": [
{
"path": "cmd/.*",
"rules": ["G204", "G304"]
},
{
"path": "scripts/.*",
"rules": ["*"]
}
]
}
علامة CLI:```bash
gosec --exclude-rules="cmd/.*:G204,G304" ./...
gosec --exclude-rules="scripts/.:" ./...
gosec --exclude-rules="cmd/.:G204,G304;test/.:G101" ./...
| Field | Type | Description |
|-------|------|-------------|
| `path` | string (regex) | Regex يُطابق مسارات الملفات |
| `rules` | []string | معرفات القواعد المستثناة. `*` لكل القواعد |
#### تكوين القاعدة
بعض القواعد تقبل أيضًا أعلام تكوين؛ هذه الأعلام موثقة في
[RULES.md](https://github.com/securego/gosec/blob/master/RULES.md).
#### إصدار Go
بعض القواعد تتطلب إصدارًا محددًا من Go يتم استرداده
من ملف وحدة Go الموجود في المشروع. إذا لم يتم العثور
على هذا الإصدار، فسيتم الرجوع إلى إصدار وقت تشغيل Go.
يتم تحليل إصدار وحدة Go باستخدام الأمر `go list`
والذي قد يؤدي في بعض الحالات إلى تدهور الأداء. في
هذه الحالة، يمكن توفير إصدار وحدة Go بسهولة عن طريق
تعيين متغير البيئة
`GOSECGOVERSION=go1.21.1`.
### التبعيات
يقوم gosec بتحميل الحزم باستخدام وحدات Go. في معظم
المشاريع، يتم حل التبعيات تلقائيًا أثناء الفحص.
إذا كانت التبعيات مفقودة، قم بتشغيل:```bash
go mod tidy
go mod download
سيتجاهل gosec ملفات الاختبار عبر جميع الحزم وأي تبعيات في دليل vendor الخاص بك.
يمكن تمكين فحص ملفات الاختبار باستخدام العلم التالي:```bash gosec -tests ./...
أيضًا يمكن استبعاد المجلدات الإضافية على النحو التالي:```bash
gosec -exclude-dir=rules -exclude-dir=cmd ./...
يمكن لـ gosec تجاهل ملفات Go المُنشأة التي تحتوي على تعليق الكود المُنشأ الافتراضي.``` // Code generated by some generator DO NOT EDIT.
Please provide the Markdown content to translate.```bash
gosec -exclude-generated ./...
يمكن لـ gosec اقتراح إصلاحات بناءً على توصية الذكاء الاصطناعي. سيقوم باستدعاء API للذكاء الاصطناعي لتلقي اقتراح حول ثغرة أمنية.
يمكنك تفعيل هذه الميزة من خلال تقديم الوسائط التالية لسطر الأوامر:
ai-api-provider: اسم مزود API للذكاء الاصطناعي.
المزودون المدعومون:
atlas (النموذج الافتراضي
deepseek-ai/deepseek-v4-flash)،
atlas-deepseek-v4-flash,
atlas-qwen3-coder-next, atlas-kimi-k2.6، أو
atlas:<model-id> لأي نموذج محادثة مستضاف على Atlas Cloud.
Atlas Cloud هو مزود متوافق مع OpenAI متاح على
atlascloud.aigemini-3-pro-preview (الافتراضي)،
gemini-2.5-pro, gemini-2.5-flash,
gemini-2.5-flash-liteclaude-sonnet-4-6 (الافتراضي)،
, ,
, ,
🎁 Atlas Cloud هي منصة استدلال ذكاء اصطناعي كاملة الوسائط تمنح المطورين API واحد للذكاء الاصطناعي للوصول إلى إنشاء الفيديو، إنشاء الصور، وواجهات LLM. بدلاً من إدارة تكاملات متعددة للبائعين، تتصل مرة واحدة وتحصل على وصول موحد لأكثر من 300 نموذج مختار عبر جميع الوسائط.
اطلع على عرض خطة البرمجة الجديد من Atlas Cloud للحصول على وصول أكثر اقتصاداً لـ API: https://www.atlascloud.ai/console/coding-plan
أمثلة:```bash
export GOSEC_AI_API_KEY="your_key" export GOSEC_AI_PROVIDER="atlas" gosec ./...
GOSEC_AI_API_KEY="your_key"
gosec -ai-api-provider="atlas:qwen/qwen3-coder-next" ./...
gosec -ai-api-provider="gemini-3-pro-preview"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="claude-sonnet-4-6"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_key" ./...
gosec -ai-api-provider="gpt-5.4"
-ai-api-key="your_azure_key"
-ai-base-url="https://your-resource.openai.azure.com/openai/deployments/your-deployment"
./...
gosec -ai-api-provider="llama3.2"
-ai-base-url="http://localhost:11434/v1"
./...
gosec -ai-api-provider="custom-model"
-ai-api-key="your_key"
-ai-base-url="https://internal-api.company.com/v1"
-ai-skip-ssl
./...
### التعليق على الكود
كما هو الحال مع جميع أدوات الكشف الآلي، ستكون هناك حالات من النتائج الإيجابية الخاطئة. في الحالات التي يُبلغ فيها gosec عن فشل تم التحقق يدويًا من أنه آمن، فمن الممكن التعليق على الكود بتعليق يبدأ بـ `#nosec`.
يجب أن يكون تنسيق تعليق `#nosec` بالشكل `#nosec [RuleList] [-- Justification]`.
يجب وضع تعليق `#nosec` في السطر الذي يتم فيه الإبلاغ عن التحذير.```go
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
بدلاً من ذلك، يدعم gosec أيضًا التوجيه //gosec:disable، الذي يعمل بشكل مشابه لـ #nosec:```go
//gosec:disable G101 -- This is a false positive
في بعض الحالات قد ترغب أيضًا في إعادة النظر في الأماكن التي تم فيها استخدام التعليقات التوضيحية `#nosec` أو `//gosec:disable`. لتشغيل الماسح الضوئي وتجاهل أي تعليقات توضيحية `#nosec` يمكنك القيام بما يلي:```bash
gosec -nosec=true ./...
لمنع التعليقات التوضيحية من إخماد القواعد غير ذات الصلة عن غير قصد،
أو من الإضافة بدون تفسير، يقبل gosec
علمين اختياريين. كلاهما افتراضيًا false، لذا
تبقى قواعد الأكواد الحالية تعمل بدون تغيير.
-nosec-require-rules يرفض التوجيهات المجردة #nosec /
//gosec:disable التي لا تسرد أي معرف قاعدة.-nosec-require-justification يرفض التوجيهات التي لا
تحمل -- justification بعد قائمة القواعد.عند التمكين، التوجيه الذي يفشل في الفحص لم يعد يقمع أي اكتشاف ويتم الإبلاغ عنه كخطأ في المخرجات، إلى جانب أي مشكلة أساسية في السطر.```bash gosec -nosec-require-rules -nosec-require-justification ./...
يمكن تعيين نفس الخيارات عبر كتلة التكوين العامة:```json
{
"global": {
"nosec-require-rules": "enabled",
"nosec-require-justification": "enabled"
}
}
كما هو موضح أعلاه، يمكننا إخفاء الانتهاكات خارجيًا (باستخدام -include/-exclude) أو مضمنًا (باستخدام تعليقات #nosec). يمكن إصدار بيانات وصفية للإخفاء لأغراض التدقيق. قم بتمكين تتبع الإخفاء باستخدام -track-suppressions:```bash
gosec -track-suppressions -exclude=G101
-fmt=sarif -out=results.sarif ./...
- بالنسبة للقمع الخارجي، يسجل gosec معلومات القمع
حيث `kind` هو `external` و `justification` هو
`Globally suppressed.`.
- بالنسبة للقمع المضمن، يسجل gosec معلومات القمع
حيث `kind` هو `inSource` و `justification` هو النص
بعد شرطتين أو أكثر في التعليق.
**ملاحظة:** فقط تنسيقات SARIF و JSON تدعم تتبع
القمع.
### علامات البناء (Build tags)
يستطيع gosec تمرير
[علامات بناء Go](https://pkg.go.dev/go/build/) الخاصة بك
إلى المحلل. يمكن تقديمها كقائمة مفصولة بفواصل على النحو التالي:```bash
gosec -tags debug,ignore ./...
يدعم gosec التنسيقات text, json, yaml, csv, junit-xml,
html, sonarqube, golint, و sarif. بشكل افتراضي،
سيتم الإبلاغ عن النتائج إلى stdout، ولكن يمكن أيضًا كتابتها إلى
ملف إخراج. يتم التحكم في تنسيق المخرجات بواسطة العلم -fmt،
ويتم التحكم في ملف الإخراج بواسطة العلم -out كما يلي:```bash
$ gosec -fmt=json -out=results.json *.go
استخدم `-stdout` لطباعة النتائج مع كتابة `-out` أيضًا.
استخدم `-verbose` لتجاوز تنسيق stdout مع الحفاظ على
تنسيق الملف.```bash
# 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، ويجب استيراد تقرير إلى SonarQube
باستخدام
sonar.externalIssuesReportPaths=path/to/gosec-report.json.
gosec -severity medium ./...
gosec -confidence medium ./...
gosec --exclude-rules="cmd/.:G204,G304;scripts/.:*" ./...
gosec -exclude-generated ./...
gosec -tests ./...
## التطوير
تم نقل توثيق التطوير إلى
[DEVELOPMENT.md](https://github.com/securego/gosec/blob/HEAD/DEVELOPMENT.md).
## من يستخدم gosec؟
هذه [قائمة](https://github.com/securego/gosec/blob/HEAD/USERS.md) ببعض مستخدمي gosec.
## الرعاة
ادعم هذا المشروع من خلال أن تصبح راعياً. سيظهر شعارك هنا مع رابط لموقعك الإلكتروني
<a href="https://github.com/mercedes-benz" target="_blank"><img src="https://assets.kitploit.com/production/public/readmes/2947/08b6f9da5faff0e986172b0c77fed0865a2cb26e6f8c58a8ae588c74bcf16f5f.png"></a>
claude-opus-4-7claude-opus-4-6claude-sonnet-4-5claude-opus-4-5claude-haiku-4-5gpt-5.4 (الافتراضي), gpt-5.4-mini,
gpt-5.4-nanoai-base-url)ai-api-key أو تعيين متغير البيئة
GOSEC_AI_API_KEY: المفتاح للوصول إلى API الذكاء الاصطناعي
ai-base-url: (اختياري) عنوان URL أساسي مخصص لـ
APIs المتوافقة مع OpenAI (مثل Azure OpenAI، LocalAI،
Ollama)
https://api.atlascloud.ai/v1 بشكل افتراضي،
لذا فإن ai-base-url اختياري للمزود atlas المدمجGOSEC_AI_PROVIDER: (اختياري) متغير بيئة
بديل لـ ai-api-providerGOSEC_AI_BASE_URL: (اختياري) متغير بيئة
بديل لـ ai-base-urlai-skip-ssl: (اختياري) تخطي التحقق من شهادة SSL
لـ API الذكاء الاصطناعي (مفيد للشهادات ذاتية التوقيع)