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

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
AWS-Tough-Library-Multiple-CVEs — مشكلة في tough، الإصدارات قبل 0.20.0 (عدة ثغرات CVE) | Kitploit
أدوات/GitHubGitHub/murataydemir/aws-tough-library-multiple-cves
تحليل الثغرات الأمنيةأمن سلسلة التوريدالأوراق والأبحاثالتعلم والتعليم
GitHubmurataydemir/aws-tough-library-multiple-cves

AWS-Tough-Library-Multiple-CVEs

مشكلة في tough، الإصدارات قبل 0.20.0 (عدة ثغرات CVE)

عرض المستودع
13منذ سنة واحدةلم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

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

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

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

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

مكتبة AWS Tough: ثغرات CVE متعددة


في مارس 2025، تم الكشف عن عدة ثغرات أمنية في مكتبة Tough التابعة لـ AWS Labs (وهي عميل Rust لتطبيق TUF – The Update Framework). يتم تتبع هذه المشكلات تحت CVE-2025-2885 وCVE-2025-2886 وCVE-2025-2887 وCVE-2025-2888، وتم إصلاحها في الإصدار 0.20.0 من Tough. يمكن لمهندسي الأمن استخدام هذا المستند لفهم التفاصيل الفنية لكل ثغرة، والسبب الجذري في قاعدة البيانات البرمجية، والتصحيحات التي تحل هذه المشكلات. يُنصح بشدة جميع مستخدمي Tough < 0.20.0 بالترقية إلى v0.20.0 أو أحدث.

CVE-2025-2885: عدم التحقق التسلسلي من إصدار Root

فشل Tough في التحقق من إصدار Root metadata بشكل تسلسلي أثناء التحديث. يمكن للمهاجم الذي يتحكم في المستودع (أو يمتلك القدرة على تنفيذ هجوم الوسيط man-in-the-middle) توفير ملف بيانات وصفية جذرية برقم إصدار غير متوقع، مما يجعل العميل يجلب ويثق في إصدار خاطئ. في جوهر الأمر، لم يضمن Tough أن يكون إصدار بيانات Root metadata الجديدة أكبر بمقدار واحد بالضبط من الإصدار الموثوق به سابقًا، وهو ما يخالف متطلب TUF الخاص بسلسلة ثقة متصلة. قد يؤدي هذا إلى هجمات التراجع أو الخلط والمطابقة (rollback or mix-and-match attacks)، حيث يتم قبول جذر قديم (لكنه مُوقَّع بشكل صحيح) كما لو كان الأحدث، مما قد يؤدي إلى إعادة إدخال مفاتيح توقيع متقاعدة أو ثقة منتهية الصلاحية.

  • النشرة الأمنية: GitHub Security Advisory GHSA-5vmp-m5v2-hx47 (CVE-2025-2885)
  • الكود المتأثر: منطق التحديث في Tough للبيانات الوصفية الجذرية في . كان التنفيذ الضعيف يتحقق فقط من أن إصدار الجذر الجديد ليس أقل من الإصدار القديم، بدلاً من اشتراط أن يكون الإصدار التالي في التسلسل. هذا الإغفال يخالف قاعدة مواصفات TUF التي تتطلب من العملاء تنزيل إصدارات الجذر الوسيطة بالترتيب (بدون تخطي الإصدارات).
tough/src/lib.rs

التنفيذ الضعيف: في الإصدار 0.19.x والإصدارات السابقة له، بعد تنزيل root.json جديد، كان Tough يتحقق من التوقيعات لكنه لم يفرض استمرارية الإصدار بشكل صارم. وقد سمح لإصدار الجذر الجديد بأن يكون أي قيمة >= الإصدار الموثوق به. على سبيل المثال، إذا كان الجذر الموثوق به حاليًا هو الإصدار N، فسيقبل Tough جذرًا جديدًا يدّعي أنه الإصدار N+2 أو أعلى (طالما كانت التوقيعات صالحة)، متجاوزًا الإصدار N+1. يوضح مقتطف الكود أدناه الفحص قبل الإصلاح:```rust // (Prior to fix) Allow new root version to be >= old version – too permissive ensure!(root.signed.version <= new_root.signed.version, error::OlderMetadataSnafu { role: RoleType::Root, current_version: root.signed.version, new_version: new_root.signed.version });

root@kitploit:~
يمكن للمهاجم استغلال ذلك من خلال تقديم <b>بيانات وصفية لجذر بإصدار أعلى وهي في الواقع مجموعة مفاتيح أقدم</b>. ستقبلها Tough معتقدةً أنها تحديث، وتثق [بمحتوى موقَّع بمفاتيح قديمة](https://github.com/advisories/GHSA-5vmp-m5v2-hx47#:~:text=The%20tough%20client%20will%20trust,with%20a%20previous%20root%20role).

<b>التنفيذ المُصحَّح:</b> يتطلب الكود المُصحَّح (في Tough 0.20.0) صراحةً أن يكون إصدار الجذر الجديد أكبر من الإصدار القديم بواحد بالضبط، انظر [commit 0eeb60a](https://github.com/awslabs/tough/commit/0eeb60aefe27f00b65730634b788a1aafb8bf3c6). كما يضمن أن يكون الإصدار الجديد أعلى (يمنع المساواة أو الانخفاض) ويمنع أي قفزة أكبر من +1:```rust
// (Fixed in v0.20.0) Enforce sequential root version update (new_version == old_version + 1)
ensure!(
    root.signed.version < new_root.signed.version && 
    root.signed.version.get() + 1 == new_root.signed.version.get(),
    error::OlderMetadataSnafu { 
        role: RoleType::Root, 
        current_version: root.signed.version, 
        new_version: new_root.signed.version 
    }
);

يضمن هذا التغيير قيام العميل بتنزيل بيانات التعريف الجذرية (root metadata) وتطبيقها بالترتيب (N، N+1، N+2، ...) دون تخطي. إذا تمت مواجهة ملف بيانات تعريف جذرية بإصدار لا يساوي تمامًا old_version+1، فإن Tough يعامله الآن كهجوم محتمل ويُجهض عملية التحديث.

  • السبب الجذري: فقدان التحقق من الإصدار التسلسلي (CWE-1288: التحقق غير السليم من قيمة فحص السلامة) كان الكود يتحقق فقط من أن الجذر الجديد ليس أقدم من الجذر الحالي، لكنه لم يكن يتحقق من القفزات غير المتوقعة.
  • الإصلاح: قم بالترقية إلى tough = 0.20.0، الذي يتضمن التصحيح. تأكد من أن أي تفرعات أو محدّثات مخصصة مبنية على Tough تطبّق نفس الفحص الصارم. من الحكمة أيضًا مراجعة السجلات بحثًا عن أي قفزات مشبوهة في إصدار الجذر ضمن سجل التحديثات كمؤشر على محاولة استغلال.

CVE-2025-2886: عدم احترام التفويض المُنهي

تعامل Tough بشكل غير صحيح مع أدوار الأهداف المفوضة “المُنهية” كما هو معرّف في TUF. في مستودع TUF، يمكن وضع علامة مُنهٍ على تفويض، بمعنى أنه إذا وصل بحث هدف إلى ذلك التفويض ولم يتم العثور على الهدف هناك، يجب أن يتوقف البحث (ولا يستمر إلى تفويضات أخرى أقل أولوية). (انظر هنا) بسبب خطأ منطقي، فشل Tough في إنهاء البحث في هذه الحالة – حيث كان يستمر في البحث في التفويضات اللاحقة حتى عندما كان ينبغي أن يتوقف. قد يسمح هذا لمهاجم يتحكم في تفويض أقل أولوية بتقديم محتوى لأهداف لا ينبغي له التحكم بها، متجاوزًا حدود الثقة المقصودة.

  • الإشعار الأمني: GitHub Security Advisory GHSA-v4wr-j3w6-mxqc (CVE-2025-2886)
  • الكود المتأثر: خوارزمية البحث عن الأهداف في tough/src/editor/targets.rs (وكود حل التفويض المرتبط به). لم يعالج الكود الهش بشكل صحيح علامة terminating على التفويضات. عند التكرار عبر التفويضات بحثًا عن هدف، كان Tough ينتقل إلى التفويض التالي حتى لو كان التفويض الحالي مُعلّمًا بأنه مُنهٍ ولم يكن هناك تطابق، بما يخالف مواصفات TUF.

التنفيذ الهش: في Tough <0.20.0، كان منطق find_target() ببساطة يستدعي نفسه بشكل متكرر أو يكرر عبر جميع الأدوار المفوضة الممكنة حتى يتم العثور على هدف أو استنفاد جميع الأدوار. لم يكن يعيّن أي علامة أو يخرج من الحلقة عند مواجهة دور مُنهٍ. الكود الزائف للسلوك القديم:```rust for role in delegation_chain { if role.has_target(target) { return target_metadata; } // Missing: if role is terminating and target not found, should break. // Tough erroneously continues to next delegation. }

root@kitploit:~
هذا يعني أن المفوَّض ذو الأولوية الأدنى (الذي ينبغي تجاهله بعد تفويض مُنهٍ فوقه) قد يظل قيد الاستشارة ويوفّر ملفًا مستهدفًا خبيثًا.

<b>التنفيذ المُصحَّح:</b> يقدّم الإصدار المصلَح آليةً لتتبّع الإنهاء وإيقاف البحث بشكل مناسب. عند مواجهة تفويض مُنهٍ لا يحتوي على الهدف، يقوم Tough الآن [بالخروج من حلقة البحث فورًا](https://github.com/awslabs/tough/commit/598111f88105a707ee68b0fa06c52da7176ea96a#:~:text=%2F%2F%20we%20encountered%20a%20terminating,so%20we%20stop%20iterating%20immediately). في الكود المُحدَّث، يتم تعيين علامة منطقية (مثل `terminated`) عند الوصول إلى دور مُنهٍ، ويتم تمريرها لأعلى مكدس الاستدعاء. على سبيل المثال:```rust
// If a terminating delegation was reached (and we didn't find the target there), stop searching further
if role.terminating && !permissive {
    // Mark that we encountered a terminating delegation
    *terminated = true;
    break;
}

بالإضافة إلى ذلك، تحمل استدعاءات find_target العودية الآن علامة terminated لضمان أنه بمجرد الإشارة إلى الإنهاء، لا يتم النظر في أي تفويضات أخرى في الحلقات عالية المستوى. كما تم تحديث RepositoryEditor::delegate_role والهياكل ذات الصلة في Tough لتخزين سمة terminating وتمريرها عبر منطق البحث.

  • السبب الجذري: خلل منطقي حيث لم ينفّذ الكود دلالات التفويض المُنهي (CWE-284: التحكم غير السليم في الوصول – يمكن للأدوار ذات الأولوية الأقل تجاوز القيود المقصودة). في الأساس، سمح غياب break عند التفويض المُنهي باعتبار بيانات أهداف غير مصرح بها.
  • التأثير: يمكن للعملاء جلب أهداف مملوكة للدور الخاطئ – وتحديدًا، إذا فوّض مشروع مجموعة فرعية من الأهداف إلى طرف آخر (ووضع علامة على هذا التفويض كمُنهٍ للحد من نطاق التجاوز)، فإن ذلك الطرف لا يزال بإمكانه تقديم محتوى عشوائي لأهداف خارج نطاقه. يؤدي هذا إلى كسر التسلسلات الهرمية للثقة في مستودع TUF.
  • المعالجة: قم بالتحديث إلى tough 0.20.0+ الذي ينفذ بشكل صحيح معالجة التفويض المُنهي. إذا كنت تحتفظ بفرع (fork) أو عميل مخصص، فتأكد من أن البحث عن الأهداف يتوقف عند التفويضات المُنهية. يجب على مختبرِي الأمان محاولة سيناريوهات إساءة استخدام التفويض على الإصدارات الأقدم فقط؛ سيتجاهل الإصدار المحدث بشكل صحيح الاستجابات الخبيثة ذات الأولوية الأقل.

CVE-2025-2887: اكتشاف غير مكتمل للتراجع عن الأهداف المفوضة

كان منطق Tough لاكتشاف هجمات التراجع في بيانات اللقطة (snapshot metadata) غير مكتمل. وتحديدًا، عند تحديث دور اللقطة (Snapshot)، يجب على Tough التحقق من أن جميع بيانات الأهداف التي شوهدت سابقًا (بما في ذلك الأهداف المفوضة) لا تزال موجودة وغير معاد إصدارها إلى إصدار أقدم في اللقطة الجديدة. (انظر هنا) وقد فرض Tough ذلك على ملف targets.json ذي المستوى الأعلى، لكنه فشل في القيام بذلك بالنسبة لملفات بيانات الأهداف المفوضة. يمكن لهذه الفجوة أن تسمح لمهاجم بحذف أو تراجع ملف هدف مفوض في بيانات اللقطة الخاصة بالمستودع دون اكتشاف، مما يؤدي إلى قبول العميل لملف هدف مفوض قديم (أو مفقود) كما لو كان حديثًا.

  • الاستشارة: استشارة أمان GitHub GHSA-q6r9-r9pw-4cf7 (CVE-2025-2887)
  • الكود المتأثر: التحقق من تحديث اللقطة في tough/src/lib.rs (الدالة التي تحمّل/تطبّق بيانات اللقطة الجديدة). الكود المعرّض للخطر كان يتحقق فقط من استمرارية دور targets.json الرئيسي في اللقطة، لكنه لم يتكرر عبر الأدوار المفوضة المدرجة في بيانات اللقطة لإجراء فحوصات مماثلة.

التنفيذ المعرّض للخطر: في Tough <0.20.0، بعد استرداد snapshot.json جديد، كان العميل يتأكد من عدم تراجع دورَي الجذر واللقطة، وكان يتأكد تحديدًا من أن targets.json لا يزال موجودًا. كما تحقق من أن إصدار targets.json في اللقطة الجديدة هو >= الإصدار السابق. ومع ذلك، إذا كانت اللقطة تحتوي على أهداف مفوضة (مثل بيانات مفوضة projects.json، user.json)، لم يتحقق العميل منها. على سبيل المثال، كان الكود في الأصل يقوم بشيء مثل:```rust // Pseudo-code of original snapshot rollback check (simplified) if let Some(old_targets_meta) = old_snapshot.meta.get("targets.json") { let new_targets_meta = new_snapshot.meta.get("targets.json").unwrap(); ensure!(new_targets_meta.version >= old_targets_meta.version, ...); } // (No checks for delegated target roles like "projects.json", "user.json", etc.)

root@kitploit:~
هذا يعني أنه إذا قام مهاجم يملك حق الوصول إلى المستودع <b>بحذف ملف بيانات مفوَّض أو إرجاعه إلى إصدار أقدم</b>، فإن عميل Tough لن يلاحظ ذلك – ما دام ملف targets.json الأساسي سليمًا. وبالتالي قد يقوم العميل بتنزيل هدف قديم من تلك التفويضية دون أن يدرك أنه كان يجب رفضه بوصفه تراجعًا.

<b>التنفيذ المُصحَّح:</b> يضيف الإصدار 0.20.0 فحوصات شاملة لـ<b>كل دور مذكور في البيانات الوصفية للقطة</b>. يتنقل الكود الجديد عبر كل إدخال في البيانات الوصفية للقطة القديمة (بما في ذلك جميع أدوار الأهداف المفوضة) ويضمن أمرين لكل منها: (1) أن الدور لا يزال موجودًا في اللقطة الجديدة، و(2) أن إصداره لم ينخفض. إذا كان أي دور مفقودًا في اللقطة الجديدة أو كان رقم إصداره أقل من ذي قبل، يُرفض التحديث باعتباره هجوم تراجع محتمل. على سبيل المثال:```rust
for (name, old_meta) in &old_snapshot.signed.meta {
    // 1. Role must appear in new snapshot
    ensure!(
        snapshot.signed.meta.contains_key(name),
        error::SnapshotRoleMissingSnafu { role: name, old_version: old_snapshot.signed.version, new_version: snapshot.signed.version }
    );
    // 2. Role’s version must not decrease
    let new_meta = snapshot.signed.meta.get(name).unwrap();
    ensure!(
        old_meta.version <= new_meta.version,
        error::SnapshotRoleRollbackSnafu { role: name, old_role_version: old_meta.version, new_role_version: new_meta.version, … }
    );
}

من خلال التكرار على جميع الأدوار (يمثل الاسم كل اسم من أسماء ملفات البيانات الوصفية مثل targets.json وdelegated-role.json وما إلى ذلك)، سيكتشف العميل ما إذا كانت أي بيانات وصفية للأهداف المفوضة قد أُزيلت أو تم التراجع عنها. سيتم إطلاق الخطأين SnapshotRoleMissing وSnapshotRoleRollback إذا اختفى أحد الأدوار أو تراجع إصداره إلى الخلف. ومن الجدير بالذكر أن Tough يضمن الآن أيضًا بشكل صريح أن اللقطة تحتوي على إدخال targets.json على الأقل (وإلا فسيُصدر خطأ SnapshotTargetsMetaMissing) كفحص سلامة​.

  • السبب الجذري: تحقق غير مكتمل – لم يطبّق Tough فحوصات التراجع بشكل موحد على أدوار الأهداف المفوضة. هذا تنفيذ جزئي لإجراء أمني، مما يترك ثغرة يمكن للمهاجمين استغلالها (CWE-352: خطوة حاسمة مفقودة في التفويض؛ وهي من الناحية المفاهيمية مجموعة فرعية من مشكلات التحقق من التكامل). كان الكود يحمي الأهداف عالية المستوى فقط، بافتراض (بشكل غير صحيح) أن الأدوار المفوضة لن تتراجع.
  • الأثر: يمكن للمهاجم القادر على التلاعب بالمستودع إخفاء التحديثات أو إعادة إدخال بيانات أهداف مفوضة قديمة دون أن يكتشفها العميل. على سبيل المثال، يمكنه تقديم ملف أهداف مفوضة أقدم موقّع بمفتاح أصبح مخترقًا الآن، ولأن Tough لم يتحقق من إصدار ذلك الملف، فسيتم قبوله. من الناحية العملية، قد يؤدي هذا إلى جلب العملاء لمحتوى قديم أو تفويت عمليات إبطال حرجة للأهداف المفوضة​. (انظر هنا)
  • المعالجة: استخدم tough v0.20.0+، الذي ينفّذ فحصًا كاملًا لتراجع اللقطات​. إذا كنت تدير محدّثًا مخصصًا، فتأكد من أنه بالنسبة إلى كل ملف بيانات وصفية موثوق مدرج في لقطة ما، فإن اللقطة الجديدة تُدرجه أيضًا برقم إصدار >= الإصدار السابق. يُوصى أيضًا بتمكين التسجيل أو التدقيق لأي عمليات إزالة لأهداف مفوضة في تحديثات المستودع، حيث يجب أن تكون نادرة وقد تشير إلى نشاط ضار إذا حدثت بشكل غير متوقع.

CVE-2025-2888: التخزين المؤقت غير السليم للبيانات الوصفية للطابع الزمني عند التراجع

تعاملت Tough بشكل غير صحيح مع تراجع مكتشف في دور الطابع الزمني. يوقّع دور الطابع الزمني في TUF أحدث إصدار من البيانات الوصفية للقطة بشكل دوري لمساعدة العملاء على اكتشاف ما إذا كانوا يرون لقطة أقدم (تراجعًا). قامت Tough بالفعل بفحص التراجع على إصدار اللقطة الموجود في الطابع الزمني، ولكن فقط بعد تخزين البيانات الوصفية للطابع الزمني الجديد مؤقتًا محليًا. إذا تم اكتشاف تراجع، كانت Tough ترفض التحديث لكنها كانت قد خزّنت بالفعل الطابع الزمني غير الصالح باعتباره “الأحدث” في ذاكرتها المؤقتة. وهذا يعني أن طابعًا زمنيًا ضارًا (بإصدار لقطة قديم) يمكن أن يسمم ذاكرة العميل المؤقتة. وبعد ذلك، قد تظهر التحديثات المشروعة اللاحقة لـ Tough على أنها تراجعات (نظرًا لأن الذاكرة المؤقتة كانت تحتفظ بطابع زمني يشير إلى إصدار لقطة أعلى من الجديد)، مما يمنع التحديثات الصالحة.

  • الاستشارة الأمنية: الاستشارة الأمنية من GitHub GHSA-76g3-38jv-wxh4 (CVE-2025-2888)
  • الكود المتأثر: منطق تحديث الطابع الزمني في tough/src/lib.rs (الدالة التي تحمّل timestamp.json الجديد). كانت المشكلة الأساسية هي خطأ في ترتيب العمليات: قامت Tough بتحديث ذاكرتها المؤقتة/حالتها المحلية بالبيانات الوصفية للطابع الزمني الجديد قبل التحقق الكامل من أن إصدار اللقطة الموجود بداخلها ليس أقدم مما شاهدته سابقًا.

التنفيذ المعرض للخطر: في Tough <0.20.0، عند جلب timestamp.json جديد، كان العميل يحلله ويكتبه في الذاكرة المؤقتة (معتبرًا إياه الطابع الزمني الموثوق الحالي) ثم يقوم بفحص التراجع على إصدار اللقطة. إذا كان إصدار اللقطة في الطابع الزمني الجديد أقل من إصدار اللقطة المسجل سابقًا (مما يشير إلى محاولة تراجع)، كانت Tough تسجل خطأ وترفض دورة التحديث تلك – لكن الذاكرة المؤقتة كانت تحتوي بالفعل على الطابع الزمني “السيئ”. لم تتم إزالة الإدخال المخزن مؤقتًا في مسار الخطأ ذلك. وبالتالي، يمكن أن يصبح الطابع الزمني “الموثوق” المسجل لدى العميل هو هذا الطابع القديم.

على سبيل المثال، افترض أن آخر إصدار لقطة معروف كان 5. يمكن للمهاجم تقديم بيانات وصفية للطابع الزمني (برقم إصدار طابع زمني أعلى) توقّع إصدار اللقطة 4. ستقبل Tough ملف الطابع الزمني (مع تخزينه مؤقتًا)، ثم تلاحظ أن اللقطة 4 < 5 وتخرج من التحديث بخطأ – لكن ذاكرتها المؤقتة الآن تقول “أحدث طابع زمني يشير إلى اللقطة 4”. عندما يأتي طابع زمني صحيح (اللقطة 5 أو 6) بعد ذلك، ترى Tough اللقطة 5 مقابل اللقطة 4 المخزنة مؤقتًا كتراجع آخر (لأنها تثق بشكل خاطئ في إصدار اللقطة 4 المخزن مؤقتًا كخط أساس)، وبالتالي ترفض حتى التحديث الصالح. تصف نشرة AWS هذا التسلسل: “يقوم العميل بتخزين البيانات الوصفية للطابع الزمني مؤقتًا على الرغم من رفضها بشكل صحيح عند اكتشاف تراجع… مما يتسبب لاحقًا في فشل tough في استهلاك التحديثات الصالحة.”​

التنفيذ المُصلَح: يضمن الإصلاح أن فحوصات التراجع تتم قبل التخزين المؤقت للطابع الزمني الجديد، ويضيف تحققًا أكثر صرامةً لمحتويات الطابع الزمني. في Tough 0.20.0، تم تعديل الدالة load_timestamp() لفرض أن تكون البيانات الوصفية للطابع الزمني سليمة البنية وأن إصدار اللقطة الخاص بها لا يقل عن إصدار اللقطة الموثوق به سابقًا قبل إتمام التحديث. على وجه التحديد، يتحقق الكود الآن من: (أ) أن البيانات الوصفية للطابع الزمني تحتوي على إدخال واحد بالضبط (يجب أن يكون فقط لـ snapshot.json)، (ب) أن هذا الإدخال موجود وتم تحليله، و(ج) أن إصدار اللقطة بداخله >= إصدار اللقطة الأقدم. (انظر هنا) فقط بعد اجتياز هذه التحققات يُعتبر الطابع الزمني الجديد موثوقًا. المنطق الحاسم المضاف موضح أدناه:```rust // Ensure the timestamp meta contains exactly one entry (the snapshot) ensure!(timestamp.signed.meta.len() == 1, error::TimestampMetaLengthSnafu { … }); let snapshot_meta = timestamp.signed.meta.get("snapshot.json"); ensure!(snapshot_meta.is_some(), error::MissingSnapshotMetaSnafu { … });

// If we have a previously trusted timestamp (old_timestamp): if let Some(old_timestamp) = old_timestamp_opt { // Check that the snapshot version in the new timestamp >= old snapshot version let old_snapshot_meta = old_timestamp.signed.meta.get("snapshot.json").unwrap(); ensure!( old_snapshot_meta.version <= snapshot_meta.unwrap().version, error::OlderSnapshotInTimestampSnafu { // details: new snapshot vs old snapshot versions snapshot_new: snapshot_meta.unwrap().version, snapshot_old: old_snapshot_meta.version, timestamp_new: timestamp.signed.version, timestamp_old: old_timestamp.signed.version } ); }

root@kitploit:~
مع هذا التغيير، إذا كان إصدار اللقطة في الطابع الزمني الجديد أقل من إصدار اللقطة الذي تمت رؤيته سابقًا، فسيفشل `ensure!` <b>قبل</b> حفظ الطابع الزمني الجديد كموثوق. يتم رفع الخطأ `OlderSnapshotInTimestamp` لإحباط التحديث. ونتيجة لذلك، سيحتفظ Tough بالطابع الزمني القديم (الصحيح) في ذاكرة التخزين المؤقت عند اكتشاف التراجع، ولن يتم تخزين الطابع الزمني السيئ كموثوق أبدًا. يمنع هذا السيناريو الذي قد يؤدي فيه رفض تحديث الطابع الزمني إلى تلويث التحديثات المستقبلية.

- <b>السبب الجذري:</b> <b>تسلسل تحديث غير سليم</b> (CWE-367: حالة سباق بين زمن الفحص وزمن الاستخدام، في سياق التحقق من البيانات الوصفية). تم إجراء فحص Tough للتراجع عن اللقطة في الطابع الزمني في الوقت الخاطئ، بعد حدوث الآثار الجانبية (التخزين المؤقت). كما أن عدم التحقق الكامل من محتويات الطابع الزمني (الطول) جعل المنطق هشًا​
- <b>التأثير:</b> يمكن لطابع زمني خبيث (بإصدار لقطة أقل) أن يخدع العميل مؤقتًا، مما يجعله يخزن حالة سيئة. يؤدي هذا إلى حجب الخدمة في آلية التحديث: سيتعامل العميل بعد ذلك مع التحديثات الحقيقية على أنها غير صالحة (كشف تراجع خاطئ)​. لا يوجد تنفيذ مباشر للكود أو سرقة بيانات، لكن <b>فشل التحديث المستمر</b> قد يكون خطيرًا بنفس القدر (على سبيل المثال، منع تطبيق التصحيحات الأمنية). (انظر [هنا](https://github.com/advisories/GHSA-76g3-38jv-wxh4#:~:text=If%20the%20tough%20client%20successfully,client%20from%20consuming%20valid%20updates))
- <b>المعالجة:</b> قم بالترقية إلى tough <b>0.20.0+</b> يعالج الإصدار المصحح أحداث تراجع الطابع الزمني بأمان. إذا لوحظ فشل في التحديث بسبب هذا الخطأ، فقد يكون من الضروري <b>مسح البيانات الوصفية المخزنة مؤقتًا</b> (لإزالة أي طابع زمني مسموم) قبل إعادة محاولة التحديث باستخدام العميل المُصحح. كممارسة عامة، يجب على العملاء دائمًا التحقق من البيانات الوصفية قبل الوثوق بها أو تخزينها مؤقتًا – وهذا الخطأ يُبرز هذا المبدأ.

المراجع:
- [نشرة أمان AWS AWS-2025-007](https://aws.amazon.com/security/security-bulletins/AWS-2025-007/) – <i>مشكلة في tough، الإصدارات السابقة لـ 0.20.0 (ثغرات CVE متعددة)​</i>
- [إدخالات قاعدة بيانات GitHub Advisory لـ CVE-2025-2885](https://github.com/advisories/GHSA-5vmp-m5v2-hx47)
- [إدخالات قاعدة بيانات GitHub Advisory لـ CVE-2025-2886](https://github.com/advisories/GHSA-v4wr-j3w6-mxqc)
- [إدخالات قاعدة بيانات GitHub Advisory لـ CVE-2025-2887](https://github.com/advisories/GHSA-q6r9-r9pw-4cf7)
- [إدخالات قاعدة بيانات GitHub Advisory لـ CVE-2025-2888](https://github.com/advisories/GHSA-76g3-38jv-wxh4)
- التزامات تصحيح Tough v0.20.0:
    - التزام إصلاح إصدار الجذر | [`awslabs/tough@​0eeb60a`](https://github.com/awslabs/tough/commit/0eeb60aefe27f00b65730634b788a1aafb8bf3c6)
    - التزام إصلاح إنهاء التفويضات​ | [`awslabs/tough@598111f`](https://github.com/awslabs/tough/commit/598111f88105a707ee68b0fa06c52da7176ea96a)
    - التزام إصلاح تراجع اللقطة | [`awslabs/tough@3345151`](https://github.com/awslabs/tough/commit/3345151a87c358d1ce43aeb7e8b3ebea5ebdbab4)
    - التزام إصلاح تراجع الطابع الزمني​ | [`awslabs/tough@9b400e1`](https://github.com/awslabs/tough/commit/9b400e1c8b7d6b9ab8009104fa7fe5884db05f18)
تنزيل الأداة