Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

··الخلاصات·اتصال·الخصوصية·© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
polytracker — أداة تتبّع مبنية على LLVM لتتبع التلوث الشامل، وتحليل تدفق البيانات، والتتبّع. | Kitploit
أدوات/GitHubGitHub/trailofbits/polytracker
تحليل الثغرات الأمنيةتحليل الشفرة الديناميكي (DAST)الهندسة العكسيةالاختبار العشوائيتحليل الملفات الثنائيةالأوراق والأبحاثالتعلم والتعليم
GitHubtrailofbits/polytracker

polytracker

أداة تتبّع مبنية على LLVM لتتبع التلوث الشامل، وتحليل تدفق البيانات، والتتبّع.

عرض المستودع
59853منذ 2 أشهرتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

PolyTracker


PyPI version Tests Slack Status

PolyTracker هي أداة أُنشئت في الأصل من أجل التعليق المعجمي الآلي والتنقل في المُحلِّلات (Automated Lexical Annotation and Navigation of Parsers)، وهو اختصار عكسي صِيغ لغرض وحيد هو الإشارة إليها باسم The ALAN Parsers Project. ومع ذلك، فقد تطوّرت لتصبح أداةً متعددة الأغراض لتنفيذ تحليل تدفق البيانات وتدفق التحكم في البرامج بكفاءة. PolyTracker هي تمريرة LLVM (pass) تُجهّز البرامج لتتبّع أيّ بايتات من ملف الإدخال تعمل عليها أيّ دوال. تُخرج قاعدة بيانات تحتوي على معلومات تدفق البيانات، بالإضافة إلى أثر تنفيذ وقت التشغيل (runtime trace). كما توفر PolyTracker مكتبة Python للتفاعل مع مخرجاتها وتحليلها، بالإضافة إلى بيئة Python تفاعلية (REPL).

يمكن استخدام PolyTracker بالتزامن مع PolyFile لتحديد الغرض الدلالي للدوال في المُحلِّل تلقائيًا. كما تتضمن ميزة تجريبية قادرة على توليد قواعد نحوية خالية من السياق (context free grammar) تمثل اللغة التي يقبلها المُحلِّل.

على عكس بدائل التجهيز الديناميكي مثل Taintgrind، تفرض PolyTracker عبئًا أدائيًا لا يُذكر على جميع المدخلات تقريبًا، وهي قادرة على تتبّع كل بايت من المدخلات في الوقت نفسه. بدأت PolyTracker كفرع (fork) من LLVM DataFlowSanitizer وتستلهم الكثير من . غير أنها، على عكس نظام Angora، قادرة على تتبّع التلوث بالكامل. في فبراير 2021، أضاف LLVM DataFlowSanitizer ميزة جديدة لتتبّع مصدر التلوث تُسمى . ومع ذلك، فهو قادر على تتبّع 16 تلوثًا كحد أقصى في المرة الواحدة، بينما يمكن لـ PolyTracker تتبّع ما يصل إلى 2-1.

Angora Fuzzer
مصدر (provenance)
تتبّع الأصل (origin tracking)
31

يُعد ملف README هذا دليل الاستخدام العام لتثبيت PolyTracker وتجميع/تجهيز الملفات التنفيذية. للتفاعل البرمجي مع PolyTracker أو توسيعها عبر واجهة Python البرمجية (API)، وكذلك للتفاعل مع آثار التنفيذ الناتجة عن الشيفرة المُجهَّزة، راجع توثيق Python.

البدء السريع

يتم التحكم في PolyTracker عبر سكربت Python يُسمى polytracker. يمكنك تثبيته عن طريق تشغيل

root@kitploit:~
pip3 install polytracker

تتطلب PolyTracker بيئة نظام محددة جدًا لكي تعمل، لذلك من المرجح أن يشغّلها جميع المستخدمين تقريبًا في بيئة حاويات (containerized). لحسن الحظ، يجعل polytracker ذلك سهلًا. كل ما عليك فعله هو تثبيت docker، ثم تشغيل:

root@kitploit:~
polytracker docker pull

و

root@kitploit:~
polytracker docker run

يقوم الأمر الأخير بتركيب (mount) دليل العمل الحالي داخل حاوية Docker الخاصة بـ PolyTracker، ويتيح لك بناء وتشغيل البرامج المُجهَّزة.

يحتوي سكربت التحكم polytracker — الذي يمكنك تشغيله من نظام المضيف أو من داخل حاوية Docker — على مجموعة متنوعة من الأوامر، سواء لتجهيز البرامج أو لتحليل الملفات الناتجة (artifacts). على سبيل المثال، يمكنك استكشاف تدفقات البيانات في التنفيذ، وإعادة بناء مخطط تدفق التحكم (control flow graph) للبرنامج المُجهَّز، وحتى استخراج قواعد نحوية خالية من السياق تطابق المدخلات التي يقبلها البرنامج. يمكنك استكشاف هذه الأوامر عن طريق تشغيل

root@kitploit:~
polytracker --help

يعمل سكربت polytracker أيضًا كبيئة REPL إذا شُغِّل دون وسائط سطر أوامر:

root@kitploit:~
$ polytracker
PolyTracker (4.0.0)
https://github.com/trailofbits/polytracker
Type "help" or "commands"
>>> commands

تجهيز برنامج C/C++ بسيط

تأتي PolyTracker أيضًا مع أمر build. يتيح هذا الأمر للمستخدم تشغيل أي أمر بناء في بيئة مُجهَّزة بـ Blight. سينتج عن ذلك ملف blight_journal.jsonl يسجّل جميع الأوامر التي نُفِّذت أثناء البناء. إذا كان لديك هدف C/C++، يمكنك تجهيزه عن طريق استدعاء polytracker build وتمرير أمر البناء الخاص بك:

root@kitploit:~
polytracker build gcc -g -o my_binary my_source.c

لتجهيز هدف بناء، استخدم الأمر instrument-targets. افتراضيًا، سيستخدم الأمر ملف blight_journal.jsonl الموجود في دليل العمل الحالي لبناء نسخة مُجهَّزة من هدف البناء. سيتم بناء هدف البناء المُجهَّز باستخدام نفس العلامات (flags) التي استُخدمت في هدف البناء الأصلي.

root@kitploit:~
polytracker instrument-targets my_binary

يدعم أمر build أيضًا برامج أكثر تعقيدًا تستخدم نظام بناء مثل autotiools أو CMake:

root@kitploit:~
polytracker build cmake .. -DCMAKE_BUILD_TYPE=Release
polytracker build ninja
# or
polytracker build ./configure
polytracker build make

ثم شغّل instrument-targets على أي من أهداف البناء:

root@kitploit:~
polytracker instrument-targets a.bin b.so

عندها سيكون a.instrumented.bin وb.instrumented.so هما النسختان المُجهَّزتان. راجع ملفات Dockerfile في دليل examples للحصول على أمثلة حول كيفية تجهيز برامج من العالم الحقيقي.

تشغيل وتحليل برنامج مُجهَّز

سيكتب البرنامج المُجهَّز مخرجاته إلى المسار المحدد في POLYDB، أو إلى polytracker.tdag إذا لم يُحدَّد. هذا ملف ثنائي يمكن التعامل معه عن طريق تشغيل:

root@kitploit:~
from polytracker import PolyTrackerTrace, taint_dag

trace = PolyTrackerTrace.load("polytracker.tdag")
tdfile = trace.tdfile

first_node = list(tdfile.nodes)[0]
print(f"First node affects control flow: {first_node.affects_control_flow}")

# Operate on all Range nodes
for index, node in enumerate(tdfile.nodes):
  if isinstance(node, taint_dag.TDRangeNode):
    print(f"Node {index}: first {node.first}, last {node.last}")

# Access taint forest
tdforest = trace.taint_forest
n1 = tdforest.get_node(1)
print(
  f"Forest node {n1.label}. Parent labels: {n1.parent_labels}, "
  f"source: {n1.source.path if n1.source is not None else None}, "
  f"affects control flow: {n1.affected_control_flow}"
)

يمكنك أيضًا تشغيل ملف تنفيذي مُجهَّز مباشرةً من بيئة REPL:

root@kitploit:~
$ polytracker
PolyTracker (4.0.0)
https://github.com/trailofbits/polytracker
Type "help" or "commands"
>>> trace = run_trace("path_to_binary", "path_to_input_file")

سيقوم هذا تلقائيًا بتشغيل الملف التنفيذي المُجهَّز في حاوية Docker، إذا لزم الأمر.

⚠️ إذا كنت تشغّل PolyTracker داخل Docker أو جهاز افتراضي (VM): يمكن أن تكون PolyTracker بطيئة جدًا عند تشغيلها في بيئة افتراضية إذا كان ملف الإدخال أو — بشكل خاص — قاعدة بيانات الإخراج موجودين في دليل تم تعيينه (mapped) أو تركيبه (mounted) من نظام التشغيل المضيف. وينطبق هذا بشكل خاص عند تشغيل PolyTracker في Docker من مضيف macOS. الحل هو كتابة قاعدة البيانات إلى مسار داخل الحاوية/الجهاز الافتراضي ثم نسخها إلى النظام المضيف في النهاية.

توثيق واجهة Python البرمجية (API) متاح هنا.

معاملات وقت التشغيل وضبط التجهيز

في وقت التشغيل، يبحث تجهيز PolyTracker عن عدد من معاملات التكوين المحددة عبر متغيرات البيئة. يتيح ذلك تعديل معاملات التجهيز دون الحاجة إلى إعادة تجميع الملف التنفيذي.

متغيرات البيئة

يقبل PolyTracker معاملات التكوين في شكل متغيرات بيئة لتجنب إعادة تجميع البرامج المستهدفة. مجموعة متغيرات البيئة الحالية التي يدعمها PolyTracker هي:

root@kitploit:~
POLYDB: A path to which to save the output database (default is polytracker.tdag)

WLLVM_ARTIFACT_STORE: Provides a path to an existing directory to store artifact/manifest for all build targets

POLYTRACKER_TAINT_ARGV: Set to '1' to use argv as a taint source.

POLYTRACKER_STDIN_SOURCE: Set to '1' to use stdin as a taint source.

POLYTRACKER_STDOUT_SINK: Set to '1' to use stdout as a taint sink.

POLYTRACKER_STDERR_SINK: Set to '1' to use stderr as a taint sink.

سيقوم Polytracker بتعيين معاملات التكوين الخاصة به بالترتيب التالي:

  1. إذا كان المعامل محددًا عبر متغير بيئة، فاستخدم تلك القيمة
  2. وإلا، إذا كانت هناك قيمة افتراضية للمعامل، فاستخدم القيمة الافتراضية
  3. وإلا، فاطرح خطأ

قوائم ABI

يستخدم DFSan قوائم ABI لتحديد الدوال التي يجب أن يجهّزها تلقائيًا، والدوال التي يجب أن يتجاهلها، وأغلفة الدوال المخصصة الموجودة. راجع توثيق dfsan لمزيد من المعلومات.

إنشاء قوائم تجاهل مخصصة من المكتبات المبنية مسبقًا

قد يكون بناء مشاريع برمجية كبيرة مستهلكًا للوقت، خاصة القديمة/غير المدعومة منها. والأكثر استهلاكًا للوقت هو محاولة تعديل نظام البناء بحيث يدعم التغييرات مثل تجهيز dfsan/تجهيزنا.

يوجد سكربت في polytracker/scripts يمكنك تشغيله على أي مكتبة ELF وسيُخرج قائمة بالدوال التي يجب تجاهلها. نستخدمه عندما لا نرغب في تتبّع المعلومات المارة عبر مكتبة معينة مثل libpng، أو مكونات فرعية أخرى من البرنامج. يوجد Dockerfile-listgen.demo لبناء مكتبات مفتوحة المصدر شائعة حتى نتمكن من إنشاء هذه القوائم.

هذا السكربت نسخة معدلة قليلًا من النسخة الموجودة لدى DataFlowSanitizer، ويركز على تجاهل مكتبات النظام. يمكن العثور على السكربت الأصلي في dfsan_rt.

بناء الأمثلة

استنسخ مستودع Git هذا. من الجذر، إما أن تبني صورة Docker الأساسية لـ PolyTracker:

root@kitploit:~
pip3 install -e ".[dev]" && polytracker docker rebuild

أو ببساطة اسحب أحدث نسخة مبنية مسبقًا من DockerHub:

root@kitploit:~
docker pull trailofbits/polytracker:latest

لتجربة توضيحية لـ PolyTracker تعمل على مُحلِّل MuPDF، شغّل هذا الأمر:

root@kitploit:~
docker build -t trailofbits/polytracker-demo-mupdf -f examples/pdf/Dockerfile-mupdf.demo .

سيتم بناء mutool_track في /polytracker/the_klondike/mupdf/build/debug. سيُخرج تشغيل mutool_track ملف polytracker.tdag الذي يحتوي على المعلومات المقدمة من تحليل التلوث.

لتجربة توضيحية لـ PolyTracker تعمل على poppler utils الإصدار 0.84.0، شغّل هذا الأمر:

root@kitploit:~
docker build -t trailofbits/polytracker-demo-poppler -f examples/pdf/Dockerfile-poppler.demo .

ستكون جميع أدوات poppler utils موجودة في /polytracker/the_klondike/poppler-0.84.0/build/utils.

root@kitploit:~
cd /polytracker/the_klondike/poppler-0.84.0/build/utils
./pdfinfo_track some_pdf.pdf

التطوير على PolyTracker باستخدام بيئة Docker

لنفترض أنك تريد التعمق أكثر في توسيع قاعدة شيفرة PolyTracker أو في تحليل آثار TDAG، ولا تريد العبث ببيئتك المحلية عن طريق تثبيت نسخة LLVM مخصصة بشكل كبير.

إذا كنت تعمل على Ubuntu وتبدأ من قاعدة نظيفة نسبيًا 22.04 أو 24.04، فإن Gist المرتبط يوضح بالتفصيل خطوات الحصول على نسخة passthrough تعمل من الحاوية الأساسية لـ PolyTracker. توفر الحاوية الأساسية بيئة تطوير بجميع التبعيات التي يمكنك العمل فيها مباشرة، أو توسيعها (كما فعلنا في ملفات Dockerfiles النموذجية).

تشغيل الاختبارات

يجب تشغيل اختبارات الوحدة الخاصة بـ Python وC++ معًا داخل حاوية Docker الخاصة بـ PolyTracker.

توجد اختبارات الوحدة Catch2 في unittests/ داخل /polytracker-build/unittests/src/taintdag/ ضمن الحاوية. شغّل الملف التنفيذي للاختبار داخل حاوية Docker بالأمر

root@kitploit:~
  cd /polytracker-build/unittests/src/taintdag/ && ./tests-taintdag

تتطلب اختبارات الوحدة Python في tests/ برامج C++ اختبارية محلية ستقوم أدوات الاختبار (fixtures) بتجهيزها. شغّلها باستخدام Pytest في دليل العمل

root@kitploit:~
  pytest tests

أو استخدم pytest لتشغيل ملف اختبار واحد بالأمر

root@kitploit:~
  pytest tests/test_foo.py

الوضع الحالي والمشكلات المعروفة

تعمل PolyTracker حاليًا على Linux فقط، لأنه النظام الوحيد المدعوم من DataFlow Santizer. هذا القيد ناتج فقط عن عدم وجود دعم لدلالات استدعاءات النظام لأنظمة التشغيل الأخرى، ويمكن إضافة ذلك في المستقبل. ومع ذلك، يعني هذا أن تشغيل PolyTracker على نظام غير Linux سيتطلب تثبيت Docker.

لن تنتشر التلوثات عبر المكتبات المُحمَّلة ديناميكيًا إلا إذا كانت تلك المكتبات مبنية من المصدر باستخدام PolyTracker، أو إذا كان هناك دعم محدد لاستدعاءات المكتبات منفذًا في PolyTracker. يوجد حاليًا دعم لنشر التلوث عبر غالبية استدعاءات مكتبة C القياسية غير المُجهَّزة. للتوضيح، ستستمر البرامج التي تستخدم دوالًا غير مُجهَّزة في العمل بشكل طبيعي، ومع ذلك، لن تنشر العمليات التي تنفذها استدعاءات مكتبات غير مدعومة التلوث. نعمل حاليًا على إضافة دعم قوي لبرامج C++، لكن أفضل النتائج حاليًا ستكون من برامج C.

إذا كانت هناك مشكلات مع Docker، فجرّب إجراء تنظيف للنظام (system prune) والبناء باستخدام --no-cache لكل من PolyTracker وأي عرض تجريبي تحاول تشغيله.

تظهر أسوأ حالة أداء لـ PolyTracker عندما يكون بايت واحد في الذاكرة ملوثًا في الوقت نفسه بعدد كبير من بايتات الإدخال من ملف المصدر. وهذا أكثر شيوعًا عند تجهيز خوارزميات الضغط والتشفير ذات أحجام الكتل الكبيرة. هناك عدد من التخفيفات لهذا السلوك قيد البحث والتطوير حاليًا.

المنشورات وحالات الاستخدام الحالية

إليك بعض ما قمنا به باستخدام PolyTracker والمتاح للعموم. إذا كنت تعرف أي شيء آخر تود رؤيته مدرجًا هنا، فيرجى إخبارنا!

  • يدمج Format Analysis Workbench العديد من ميزات PolyTracker من إصدارات مختلفة من قاعدة الشيفرة، ألا وهي استخراج القواعد النحوية واكتشاف النقاط العمياء.
  • Harmon, Carson, Bradford Larsen, and Evan A. Sultanik. "Toward automated grammar extraction via semantic labeling of parser implementations." 2020 IEEE Security and Privacy Workshops (SPW). IEEE, 2020.
  • Brodin, Henrik, Marek Surovič, and Evan Sultanik. "Blind spots: Identifying exploitable program inputs." 2023 IEEE Security and Privacy Workshops (SPW). IEEE, 2023.
  • استخدم Henrik وظيفة تحليل الأثر الخاصة بالنقاط العمياء في PolyTracker (وبشكل أكثر دقة mapping وcavities) لتحديد موقع ثغرة CVE بدقة وكتب عنها في مدونة Trail of Bits.
  • Kaoudis, Kelly, Henrik Brodin, and Evan Sultanik. "Automatically Detecting Variability Bugs Through Hybrid Control and Data Flow Analysis." 2023 IEEE Security and Privacy Workshops (SPW). IEEE, 2023.
  • Evan Sultanik, Marek Surovič, Henrik Brodin, Kelly Kaoudis, Facundo Tuesca, Carson Harmon, Lisa Overall, Joseph Sweeney, and Bradford Larsen. "PolyTracker: Whole-Input Dynamic Information Flow Tracing." In Proceedings of the 33rd ACM SIGSOFT International Symposium on Software Testing and Analysis (ISSTA), 2024.

الترخيص والإقرارات

طُوّر هذا البحث بواسطة Trail of Bits بتمويل من وكالة مشاريع الأبحاث الدفاعية المتقدمة (DARPA) في إطار برنامج SafeDocs بصفة مقاول من الباطن لصالح Galois. وهو مرخص بموجب رخصة Apache 2.0. © 2019, Trail of Bits.

القائمون على الصيانة

يرجى التواصل معنا باستخدام [email protected].

Evan Sultanik
Henrik Brodin
Kelly Kaoudis

القائمون على الصيانة السابقون

Marek Surovič
Facundo Tuesca

تنزيل الأداة