
OpenAnt من Knostic هو المنتج الرائد مفتوح المصدر القائم على LLM لاكتشاف الثغرات، حيث يساعد المدافعين على اكتشاف الثغرات الأمنية المؤكدة بشكل استباقي مع تقليل كل من الإيجابيات الكاذبة والسلبيات الكاذبة. المرحلة 1 تكتشف. المرحلة 2 تهاجم. ما يصمد هو الحقيقي.
OpenAnt من Knostic هو أول منتج مفتوح المصدر لاكتشاف الثغرات الأمنية المعتمد على نماذج اللغة الكبيرة (LLM) (يُسمى الآن harness) يساعد المدافعين على اكتشاف العيوب الأمنية المُتحقَّق منها بشكل استباقي مع تقليل كل من الإيجابيات الكاذبة والسلبيات الكاذبة. المرحلة 1 تكتشف. المرحلة 2 تهاجم. ما ينجو هو الحقيقي.
ضع في اعتبارك أن هذا بدأ كمشروع بحثي، ومع تطويرنا لقدرات جديدة، غالبًا ما نطلقها كنسخة تجريبية (beta). نرحب بالمساهمات.
يمكنك العثور على ورقتنا البحثية حول بناء OpenAnt على arXiv: OpenAnt: LLM-Powered Vulnerability Discovery Through Code Decomposition, Adversarial Verification, and Dynamic Testing، بقلم Nahum Korda و Gadi Evron.
كان هذا سؤالًا ذا صلة في ملف readme عندما أطلقنا OpenAnt لأول مرة، نظرًا لأن العديد من الـ harnesses الأخرى قد تم إطلاقها. ما زلنا نأمل أنه مع انفجار الثغرات المكتشفة بالذكاء الاصطناعي، سيساعد OpenAnt مشرفي المصادر المفتوحة على البقاء في صدارة المهاجمين، حيث يمكنهم استخدامه بأنفسهم. أو إرسال مستودعهم للفحص دون أي تكلفة.
هناك أيضًا حقيقة أن تركيز Knostic ينصب على حماية الوكلاء (agents) ومساعدي البرمجة وليس على أبحاث الثغرات أو أمن التطبيقات، ونحن نحب المصادر المفتوحة، لذا قررنا إطلاق OpenAnt تحت رخصة Apache 2. علاوة على ذلك، ربما سمعت عن Aardvark من OpenAI (المعروف الآن باسم Codex Security) و Claude Code Security من Anthropic، وليس لدينا أي نية للتنافس معهم.
للتفاصيل التقنية والقيود وتكاليف الرموز (tokens)، اطلع على منشور المدونة هذا: https://knostic.ai/blog/openant
لإرسال مستودعك للفحص: https://knostic.ai/blog/oss-scan
المشرف والبحث: Gadi Evron
البحث الأصلي، وتوليد الأفكار، والنموذج الأولي الأصلي: Nahum Korda. التحويل الأولي إلى منتج: Alex Raihelgaus، Daniel Geyshis.
مع الشكر إلى: Michal Kamensky، Imri Goldberg، Daniel Cuthbert. Josh Grossman، و Avi Douglen.
إذا أعجبك عملنا، اطلع على ما نقوم به في Knostic لحماية وكلائك ومساعدي البرمجة، ومنعهم من حذف القرص الصلب والشيفرة الخاصة بك، والتحكم في مخاطر سلسلة التوريد المرتبطة مثل خوادم MCP والإضافات والمهارات (skills).
ابنِ ملف CLI التنفيذي (يتطلب Go 1.25+):
cd apps/openant-cli && make build
يقوم هذا بترجمة شيفرة Go وإخراج الملف التنفيذي إلى apps/openant-cli/bin/openant.
أنشئ رابطًا رمزيًا (symlink) له في PATH الخاص بك حتى تتمكن من تشغيل openant من أي مكان:
ln -sf "$(pwd)/apps/openant-cli/bin/openant" /usr/local/bin/openant
ملاحظة: شغّل هذا من جذر المستودع حتى يُحل $(pwd) إلى المسار المطلق الصحيح.
يوجّه OpenAnt كل مرحلة من مراحل خط الأنابيب (pipeline) عبر زوج قابل للتكوين (provider, model). أسرع مسار هو المعالج التفاعلي (wizard):
openant setup llm
تسمّي التكوين (مثل my-llm)، وتختار مزوّدًا لكل مرحلة من مراحل خط الأنابيب (أي من المحوّلات (adapters) المضمّنة أدناه)، وتُدخل مفتاح API الخاص به مرة واحدة لكل مزوّد (يستخدم Bedrock سلسلة بيانات اعتماد AWS بدلاً من ذلك — اترك المفتاح فارغًا)، ويختبر المعالج كل زوج فريد من المزوّد+النموذج بطلب من رمز واحد (1-token) قبل كتابة ~/.config/openant/config.json. شغّل فحصًا باستخدامه عبر --llm-config:
openant scan /path/to/repo --llm-config my-llm
تعكس الإعدادات الافتراضية للمعالج توصيات المشروع لكل مرحلة (نماذج استدلال أقوى للكشف / التحقق / مراجعة إمكانية الوصول؛ نماذج أخف للسياق والتقرير وتوليد الاختبارات) — تجاوز أي إجابة حسب رغبتك.
| نوع المزوّد | مفتاح API من | ملاحظات |
|---|---|---|
anthropic | console.anthropic.com | المحوّل المرجعي. غير مشمول في اشتراكات Claude Pro / Max — فاتورة منفصلة. |
openai | platform.openai.com | غير مشمول في اشتراكات ChatGPT / Codex — فاتورة منفصلة. |
google | aistudio.google.com | غير مشمول في Gemini Advanced — فاتورة منفصلة. |
bedrock | — (سلسلة بيانات اعتماد AWS) | Claude على AWS Bedrock. لا يوجد api_key: تأتي بيانات الاعتماد من متغيرات البيئة AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEY أو ملف تعريف ~/.aws، والمنطقة من AWS_REGION. معرّفات النماذج هي ملفات تعريف الاستدلال (us.anthropic.claude-sonnet-4-6، global.anthropic.claude-haiku-4-5-20251001-v1:0، ...) — فعّلها تحت "Model access" في وحدة تحكم Bedrock واعرضها عبر aws bedrock list-inference-profiles. مُتاح عبر openant setup llm (اترك مفتاح API فارغًا — سلسلة بيانات اعتماد AWS، يتم تخطي الاختبار) — الدليل الكامل: utilities/llm/providers/BEDROCK.md. |
openrouter | openrouter.ai | بوابة إلى العديد من المزوّدين بمفتاح واحد ورصيد مدفوع مسبقًا واحد (يقرأ أيضًا OPENROUTER_API_KEY). معرّفات النماذج هي slugs بصيغة vendor/model (anthropic/claude-sonnet-4.6، openai/gpt-4o-mini، ...) — تصفحها على openrouter.ai/models. مُتاح عبر openant setup llm (اترك عنوان URL الأساسي فارغًا لاستخدام الإعداد الافتراضي لـ OpenRouter) — الدليل الكامل: utilities/llm/providers/OPENROUTER.md. |
جميعها تدعم استدعاء الأدوات (tool calling)، لذا يمكن لأي منها تشغيل مرحلتي enhance و verify التي تستخدم حلقة استخدام الأدوات الوكيلية (agentic tool-use loop). بالنسبة لـ Ollama، اختر نموذجًا قادرًا على الأدوات لتلك المراحل — قد لا تتعامل النماذج المحلية الصغيرة جدًا مع استدعاءات الأدوات بشكل موثوق.
إذا كنت تريد الإعدادات الافتراضية الحالية لـ Claude لكل مرحلة ولا شيء غير ذلك، فتجاوز المعالج:
openant set-api-key sk-ant-...
openant scan /path/to/repo
يستخدم هذا التكوين المدمج openant-default (مُجمَّع في الملف التنفيذي، لا حاجة إلى config.json) — Claude Opus 4.6 لمراحل الكشف، و Sonnet 4 للباقي.
يكتب المعالج ~/.config/openant/config.json نيابة عنك، لكن يمكنك تعديله مباشرة أيضًا. يجب أن يسرد كل llm-config جميع مراحل خط الأنابيب السبع:
{
"$schema_version": 2,
"default_llm": "my-llm",
"llm_providers": {
"anthropic": {"type": "anthropic", "api_key": "sk-ant-..."},
"openai": {"type": "openai", "api_key": "sk-proj-..."},
"google": {"type": "google", "api_key": "AIza...", "request_timeout": 600}
},
"llm_configs": {
"my-llm": {
"app_context": {"provider": "openai", "model": "gpt-4o-mini"},
"llm_reach": {"provider": "anthropic", "model": "claude-opus-4-6"},
"enhance": {"provider": "openai", "model": "gpt-4o-mini"},
"analyze": {"provider": "anthropic", "model": "claude-opus-4-6"},
"verify": {"provider": "anthropic", "model": "claude-opus-4-6"},
"dynamic_test": {"provider": "google", "model": "gemini-2.0-flash"},
"report": {"provider": "google", "model": "gemini-2.0-flash"}
}
}
}
يضبط llm_providers[name].request_timeout (بالثواني، عدد صحيح موجب أو null) مهلة HTTP لكل طلب الخاصة بالمحوّل — يُستخدم بواسطة نوع المزوّد google (الوحيد الذي يكون إعداد SDK الافتراضي له غير محدود)؛ تحذّر الأنواع الأخرى بصوت عالٍ عند بدء التشغيل إذا تم تعيينه.
تقبل المزوّدات base_url مخصصًا لوكلاء OpenAI المتوافقين / Anthropic المتوافقين (vLLM، Bedrock، البوابات الداخلية)؛ لدى OpenRouter نوع مزوّد openrouter من الدرجة الأولى خاص به. تكوين openant-default (Claude عبر جميع المراحل) مدمج ومتاح دائمًا بغض النظر عن محتويات الملف.
طبقة المحوّل في OpenAnt هي وصفة Python صغيرة — ملف Python واحد ينفّذ بروتوكول LLMAdapter، ومصنع واحد لـ harness اختبار العقد (contract-test)، بالإضافة إلى إدخال في السجل — وهذا وحده كافٍ لتشغيل المحوّل من تكوين مكتوب يدويًا. لكي يُتاح أيضًا عبر معالج openant setup llm ويجتاز اختباره قبل الحفظ، أضف بعض نقاط الاتصال في Go في apps/openant-cli/cmd/setup.go (قائمة المزوّدين المدعومين، و case للاختبار، وخرائط النموذج الافتراضي لكل مرحلة) بالإضافة إلى دالة اختبار في Go. تُشغَّل اختبارات العقد الـ 12 تلقائيًا على محوّلك بمجرد ربطه. راجع docs/features/llm-providers/HOW_TO_ADD_AN_ADAPTER.md للوصفة الكاملة.
شيفرة التحليل والتحسين والتحليل وإعداد التقارير في OpenAnt هي Python 3.11+. يختار CLI الخاص بـ Go مفسّرًا بهذا الترتيب:
OPENANT_PYTHON (اضبطه لتثبيت مفسّر معين — مثل OPENANT_PYTHON=python3.11).~/.openant/venv/ (تُنشأ تلقائيًا عند أول استخدام). يستخدم CLI المسار bin/python على Linux/macOS و Scripts\python.exe على Windows.python3 / python على PATH.إذا لم يُنتج أي منها Python 3.11+، يخرج الأمر بخطأ يشير إلى python.org. لإعادة بناء بيئة افتراضية مُدارة قديمة (مثلًا بعد ترقية Python)، احذف ~/.openant/venv/ وأعد تشغيل أي أمر openant.
ينشئ OpenAnt دليلين:
~/.config/openant/ — تكوين CLI (config.json). يخزّن مفتاح API الخاص بك والمشروع النشط والتفضيلات. أذونات الملف مقيّدة بـ 0600.~/.openant/ — بيانات المشروع. يحصل كل مشروع مُهيَّأ على مساحة عمل تحت ~/.openant/projects/<org>/<repo>/ تحتوي على project.json ودليل scans/ بمخرجات لكل commit.وجّه OpenAnt إلى مستودع. علامة -l (اللغة) مطلوبة — استخدم go أو python.
# Remote — clones the repo
openant init <repo-url> -l go
# Remote — pin to a specific commit
openant init <repo-url> -l go --commit <sha>
# Local — references the directory in-place
openant init <path-to-repo> -l go --name <org/repo>
يُنشئ هذا مساحة عمل للمشروع ويعيّنها كمشروع نشط. تعمل جميع الأوامر اللاحقة على المشروع النشط تلقائيًا — دون الحاجة إلى وسائط مسار.
تلتقط كل خطوة مخرجات الخطوة السابقة من دليل فحص المشروع:
openant parse
openant enhance
openant analyze
openant verify
openant build-output
openant report -f summary
أو شغّل خط الأنابيب الكامل بأمر واحد:
openant scan --verify
openant scan — وكل فعل خطوة (analyze، verify، …) عند التشغيل خطوة بخطوة —
يخرج بـ 1 عندما يجد ثغرات — هذا يعني أن الأداة تعمل، وليس فشلها. العقد:
| رمز الخروج | المعنى |
|---|---|
| 0 | فحص نظيف — لم يتم العثور على ثغرات |
| 1 | تم العثور على ثغرات (تشغيل ناجح) |
| 2 | خطأ — فشل الفحص نفسه (تحقق من errors في غلاف JSON على stdout) |
تعامل خطوات CI العامة ومشرفو العمليات أي خروج غير صفري كفشل، مما يصنّف تشغيل النتائج السليم بشكل خاطئ. اعتمد على العقد بدلاً من تحليل stdout:
rc=0
openant scan --verify /path/to/repo || rc=$? # || captures: set -e safe
if [ "$rc" -gt 1 ]; then
echo "scan FAILED (exit $rc)" >&2; exit "$rc"
fi
# rc 0 = clean, rc 1 = findings found — both are successful runs
صيغة || rc=$? مهمة: الإعداد الافتراضي لـ CI هو set -e (GitHub Actions run:، Jenkins sh)،
حيث أن openant scan المجرّد الذي يخرج بـ 1 سيُنهي السكربت قبل سطر الالتقاط —
مما يعيد إنتاج بالضبط التصنيف الخاطئ الذي وُجد هذا القسم لمنعه.
يبدأ openant serve واجهة ويب محلية فوق نفس خط أنابيب الفحص: أرسل
عنوان URL لمستودع أو مسارًا محليًا، وشاهد سجلات الفحص تُبث مباشرة، واقرأ تقرير
HTML والملخص بصيغة markdown والإفصاحات — كل ذلك من المتصفح.
openant serve # http://127.0.0.1:8080, opens your browser
openant serve --addr 127.0.0.1:9000 # choose a port
يرتبط الخادم بواجهة الاسترجاع (loopback) فقط (يرفض أي --addr غير loopback) وهو
مخصص للاستخدام المحلي لمستخدم واحد. تستمر مخرجات الفحص تحت
~/.openant/webui/ عبر عمليات إعادة التشغيل. لا يزال التحليل يرسل الشيفرة المصدرية إلى مزوّد
LLM المُكوَّن لديك، تمامًا مثل CLI.
بالنسبة للمستودعات التي يكون فيها الفحص الكامل بطيئًا أو مكلفًا للغاية، يمكن لـ OpenAnt تقييد خط الأنابيب على الوحدات التي تتداخل أجسامها مع hunk من git diff:
openant scan --diff-base origin/main # diff vs a ref
openant scan --pr 123 # diff vs the base of a GitHub PR
openant scan --staged # diff vs HEAD using the staged index
openant scan --incremental # diff vs the last successful scan
يقرأ --staged الأمر git diff --cached وهو مخصص لخطافات pre-commit أو
تشغيلات "افحص ما أنا على وشك إيداعه" المحلية. الأساس هو HEAD؛ والرأس هو
الفهرس، لذا تُفحص الملفات المُجهَّزة بـ git add ولا تُفحص التعديلات الموجودة في شجرة العمل فقط.
الصيغة الأقصر openant diff تأخذ نفس العلامات، مثل:
openant diff --staged --skip-dynamic-test
يعمل خط الأنابيب على مشروع واحد في كل مرة. يؤدي تشغيل openant init إلى تعيين المشروع المُهيَّأ حديثًا كمشروع نشط، لذا تستهدفه جميع الأوامر اللاحقة افتراضيًا.
إذا كنت تعمل مع عدة مشاريع، فلديك خياران:
# Option 1: switch the active project
openant project switch org/repo
openant parse
# Option 2: target a project directly with -p
openant parse -p org/repo
openant project list # shows all projects, marks active
openant project show # details of active project
openant project switch <org/repo> # switch active project
نرحب بطلبات السحب (PRs) — افتح issue أولاً إذا كان النطاق غير بسيط حتى نتمكن من التوافق قبل أن تبني.
هذا المشروع مرخّص بموجب Apache 2. راجع ملف LICENSE للتفاصيل.
هذا المشروع مخصص لأغراض دفاعية وبحثية فقط. لا يزال OpenAnt في مرحلة البحث، استخدمه بحذر وعلى مسؤوليتك الخاصة. لا يتحمل Knostic و OpenAnt والمطورون والباحثون والمشرفون المرتبطون بهم أي مسؤولية على الإطلاق عن أي إساءة استخدام أو ضرر أو عواقب تنشأ عن استخدام هذه الأداة.
افحص فقط الشيفرة التي تملكها أو لديك إذن صريح باختبارها. إذا اكتشفت ثغرة في مشروع شخص آخر بوسائل مشروعة، فيرجى اتباع ممارسات الإفصاح المنسّق عن الثغرات والإبلاغ عنها للمشرفين قبل جعلها علنية.
ollama |
| — (خادم محلي) |
نماذج محلية عبر Ollama. لا يوجد api_key: اتركه فارغًا (يُرسل عنصر نائب تلقائيًا)؛ عنوان URL الأساسي افتراضيًا http://localhost:11434/v1. يجب سحب النماذج أولاً (ollama pull <model>)؛ معرّفات النماذج هي بالضبط ما يعرضه ollama list. الاستدلال المحلي مجاني — تقرير تكلفة بقيمة $0. مُتاح عبر openant setup llm — الدليل الكامل: utilities/llm/providers/OLLAMA.md. |