اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
Scudo هو أداة توزيع ذاكرة ديناميكية في وضع المستخدم أو أداة توزيع المكبّر، وهي مصمّمة
لتكون مقاومة للثغرات الأمنية المرتبطة بالمكبّر (مثل تدفّق ملف التخزين المؤقت القائم على المكبّر والاستخدام بعد التحرير
والتحرير المزدوج)
مع الحفاظ على الأداء. وتوفّر هذه البنية الأساسية عناصر تخصيص ملف C و
إلغاء تخصيصه (مثل
malloc وfree)، بالإضافة إلى عناصر C++ الأساسية (مثل new وdelete).
إنّ Scudo هو أداة تخفيف للمخاطر أكثر من أن تكون أداة رصد فعّالة لأخطاء الذاكرة، مثل AddressSanitizer (ASan).
منذ إصدار Android 11، يتم استخدام scudo لجميع الرموز البرمجية الأصلية
(باستثناء الأجهزة ذات الذاكرة المنخفضة، حيث لا يزال يتم استخدام jemalloc). في وقت التشغيل، تعالج أداة Scudo جميع عمليات تخصيص وتدمير ملف الذاكرة المؤقتة الأصلية لجميع الملفات التنفيذية وملفات مكتبة
التابعة لها، ويتم إيقاف العملية في حال رصد أي تلف أو سلوك
مريب في ملف الذاكرة المؤقتة.
يمكنك تفعيل أو إيقاف إجراءات التخفيف الإضافية في
الموزّع باستخدام الخيارات الموضّحة أدناه.
التخصيص
يمكن تحديد بعض مَعلمات آلية التوزيع على أساس كل عملية
بطرق متعدّدة:
بشكل ثابت: حدِّد دالة __scudo_default_options
في البرنامج تُعرِض سلسلة الخيارات التي سيتم تحليلها. يجب أن تحتوي هذه الدالة
على النموذج الأوّلي التالي: extern "C" const char
*__scudo_default_options().
ديناميكيًا: استخدِم متغيّر البيئة SCUDO_OPTIONS
الذي يحتوي على سلسلة الخيارات المطلوب تحليلها. إنّ الخيارات المحدّدة بهذه الطريقة
تلغي أيّ تعريف تمّ إجراؤه من خلال __scudo_default_options.
تتوفّر الخيارات التالية.
Option
الإصدار 64 بت التلقائي
الإصدار التلقائي بسعة 32 بت
الوصف
QuarantineSizeKb
256
64
حجم الحجر الصحي (بالكيلوبايت) المستخدَم لتأخير عملية إلغاء تخصيص
الشرائح قد تؤدي القيمة الأقل إلى تقليل استخدام الذاكرة، ولكنّها تؤدي إلى انخفاض فعالية تدابير التخفيف. أمّا القيمة السالبة، فتؤدي إلى الرجوع إلى الإعدادات التلقائية. يؤدي ضبط كلاً من هذين الخيارَين وThreadLocalQuarantineSizeKb على القيمة صفر إلى إيقاف وضع
العزل تمامًا.
QuarantineChunksUpToSize
2048
512
الحد الأقصى لحجم المقاطع التي يمكن عزلها (بالبايت)
ThreadLocalQuarantineSizeKb
64
16
حجم ذاكرة التخزين المؤقت لكل سلسلة محادثات (بالكيلوبايت) المستخدَمة لتخفيف الضغط عن الحجر الصحي العام
قد تؤدي القيمة الأقل إلى تقليل استخدام الذاكرة، ولكن قد تزيد من الصراع على
العزلة الشاملة. يؤدي ضبط كل من هذا الإعداد وQuarantineSizeKb على القيمة صفر
إلى إيقاف الحجر الصحي بالكامل.
DeallocationTypeMismatch
false
false
تفعيل الإبلاغ عن الأخطاء في malloc/delete وnew/free وnew/delete[]
DeleteSizeMismatch
true
true
تفعيل إعداد تقارير الأخطاء في حال عدم تطابق أحجام الملفات الجديدة والملفات المُراد حذفها
ZeroContents
false
false
تفعيل محتوى الوحدات غير القابلة للتقسيم عند التخصيص وإلغاء التخصيص
allocator_may_return_null
false
false
تشير إلى أنّه يمكن لعامل التوزيع عرض قيمة فارغة عند حدوث خطأ قابل للاسترداد بدلاً من إنهاء العملية.
hard_rss_limit_mb
0
0
عندما يصل معدل نقل البيانات في العملية إلى هذا الحدّ، تنتهي العملية.
soft_rss_limit_mb
0
0
عندما يصل معدل نقل البيانات في الثانية الخاص بالعملية إلى هذا الحدّ، يتعذّر إجراء المزيد من عمليات التوزيع أو
يظهر الرمز null (حسب قيمة allocator_may_return_null)، إلى أن يعود معدل نقل البيانات في الثانية إلى الانخفاض للسماح بعمليات توزيع جديدة.
allocator_release_to_os_interval_ms
5000
لا ينطبق
لا يؤثر إلا في أداة تخصيص 64 بت. في حال ضبطها، يحاول الجهاز تحرير الذاكرة غير المستخدَمة لمنح مساحتها لنظام التشغيل، ولكن ليس بمعدل تكرار أعلى من هذا الفاصل الزمني (بالملّي ثانية).
إذا كانت القيمة سالبة، لا يتم تحرير الذاكرة لنظام التشغيل.
abort_on_error
true
true
في حال ضبطها، تستدعي الأداة abort() بدلاً من _exit()
بعد طباعة رسالة الخطأ.
التحقُّق
لا تتوفّر حاليًا اختبارات CTS مخصّصة لتطبيق Scudo. بدلاً من ذلك، تأكَّد من اجتياز اختبارات CTS مع تفعيل Scudo أو بدونه لبرنامج ثنائي معيّن للتحقّق من عدم تأثُّر الجهاز.
تحديد المشاكل وحلّها
في حال رصد مشكلة لا يمكن حلّها، يعرض الموزّع
رسالة خطأ لموصّف الخطأ العادي، ثم يُنهي العملية.
تتم إضافة عمليات تتبُّع تسلسل استدعاء الدوال البرمجية التي تؤدي إلى إنهاء العملية في سجلّ النظام.
يبدأ الإخراج عادةً برمز Scudo ERROR: متبوعًا ب summary
قصير للمشكلة بالإضافة إلى أي إشارات.
في ما يلي قائمة برسائل الخطأ الحالية وأسبابها المحتملة:
corrupted chunk header: تعذّر التحقّق من صحة المجموع الاختباري لعنوان
القطعة. من المحتمل أن يرجع ذلك إلى سببَين: إما أنّه تمت
إعادة كتابة الرأس (جزئيًا أو كليًا)، أو أنّ المؤشر الذي تم تمريره إلى الدالة ليس
قطعة.
race on chunk header: تحاول سلاسل محادثتَان مختلفتان
التلاعب بالعنوان نفسه في الوقت نفسه. يشير ذلك عادةً إلى حالة
تداخل أو عدم قفل المحتوى بشكل عام عند تنفيذ العمليات على
هذا الجزء.
invalid chunk state: ليست الشريحة في الحالة المتوقّعة لمحاولة معيّنة، على سبيل المثال، لم يتم تخصيصها عند محاولة تحريرها، أو لم يتم وضعها في الحجر الصحي عند محاولة إعادة تدويرها. إنّ عملية تحرير الذاكرة مرتين هي السبب المعتاد
لظهور هذا الخطأ.
misaligned pointer: يتم فرض متطلبات alignment
الأساسية بشكلٍ صارم: 8 بايت على الأنظمة الأساسية 32 بت و16 بايت على الأنظمة الأساسية 64 بت.
إذا لم يكن المؤشر الذي تم تمريره إلى وظائفنا متوافقًا مع هذه الشروط، يعني ذلك أنّ المؤشر الذي تم تمريره إلى إحدى
الوظائف غير مُحاذاة.
allocation type mismatch: عند تفعيل هذا الخيار، يجب أن تتطابق دالّة إلغاء التخصيص التي يتم استدعاؤها في قطعة مع نوع الدالة التي تم استدعاؤها لتخصيصها.
ويمكن أن يؤدي هذا النوع من عدم المطابقة إلى حدوث مشاكل في الأمان.
invalid sized delete: عند استخدام عامل التشغيل delete المزوّد بحجم في C++14
وتفعيل التحقّق الاختياري، يحدث تعارض بين الحجم الذي
تم تمريره عند إلغاء تخصيص جزء والحجم الذي تم طلبه عند تخصيصه.
وعادةً ما تكون هذه مشكلة في المُجمِّع أو
التباس في النوع
في الكائن الذي يتمّ إلغاء تخصيصه.
RSS limit exhausted: تم تجاوز الحد الأقصى المسموح به لخلاصة RSS التي تم تحديدها اختياريًا.
إذا كنت بصدد تصحيح أخطاء في نظام التشغيل نفسه، يمكنك استخدام
إصدار نظام التشغيل HWASan. إذا كنت بصدد debugging a crash in an app، من الممكن استخدام
HWASan app build أيضًا.
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Scudo is a dynamic user-mode memory allocator, or *heap* allocator, designed\nto be resilient against heap-related vulnerabilities (such as [heap-based buffer\noverflow](https://cwe.mitre.org/data/definitions/122.html), [use after free](https://cwe.mitre.org/data/definitions/416.html),\nand [double free](https://cwe.mitre.org/data/definitions/415.html))\nwhile maintaining performance. It provides the standard C allocation and\ndeallocation primitives (such as [malloc](http://pubs.opengroup.org/onlinepubs/009695399/functions/malloc.html) and free), as well as the C++ primitives (such as new and delete).\n\nScudo is more of a mitigation than a fully fledged memory error\ndetector like [AddressSanitizer (ASan)](/docs/security/test/sanitizers#addresssanitizer).\n\nSince the Android 11 release, scudo is used for all native code\n(except on low-memory devices, where jemalloc is still used). At runtime, all native heap\nallocations and deallocations are serviced by Scudo for all executables and their library\ndependencies, and the process is aborted if a corruption or suspicious\nbehavior is detected in the heap.\n\nScudo is [open source](https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/scudo) and part of LLVM's compiler-rt project. Documentation is\navailable at \u003chttps://llvm.org/docs/ScudoHardenedAllocator.html\u003e. The Scudo runtime ships\nas part of the Android toolchain and support was added to [Soong and Make](https://android.googlesource.com/platform/build/soong/)\nto allow for easy enabling of the allocator in a binary.\n\nYou can enable or disable extra mitigation within\nthe allocator using the options described below.\n\nCustomization\n-------------\n\nSome parameters of the allocator can be defined on a per-process basis\nthrough several ways:\n\n- **Statically:** Define a `__scudo_default_options` function in the program that returns the options string to be parsed. This function must have the following prototype: `extern \"C\" const char\n *__scudo_default_options()`.\n- **Dynamically:** Use the environment variable `SCUDO_OPTIONS` containing the options string to be parsed. Options defined this way override any definition made through `__scudo_default_options`.\n\nThe following options are available.\n| **Note:** Frontend options have a different name format than backend options.\n\n| Option | 64-bit default | 32-bit default | Description |\n|---------------------------------------|----------------|----------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `QuarantineSizeKb` | `256` | `64` | The size (in KB) of quarantine used to delay the actual deallocation of chunks. A lower value may reduce memory usage but decrease the effectiveness of the mitigation; a negative value falls back to the defaults. Setting both this and `ThreadLocalQuarantineSizeKb` to zero disables the quarantine entirely. |\n| `QuarantineChunksUpToSize` | `2048` | `512` | The size (in bytes) up to which chunks can be quarantined. |\n| `ThreadLocalQuarantineSizeKb` | `64` | `16` | The size (in KB) of per-thread cache use to offload the global quarantine. A lower value may reduce memory usage but might increase contention on the global quarantine. Setting both this and `QuarantineSizeKb` to zero disables the quarantine entirely. |\n| `DeallocationTypeMismatch` | `false` | `false` | Enables error reporting on malloc/delete, new/free, new/delete\\[\\] |\n| `DeleteSizeMismatch` | `true` | `true` | Enables error reporting on mismatch between sizes of new and delete. |\n| `ZeroContents` | `false` | `false` | Enables zero chunk contents on allocation and deallocation. |\n| `allocator_may_return_null` | `false` | `false` | Specifies that the allocator can return null when a recoverable error occurs, instead of terminating the process. |\n| `hard_rss_limit_mb` | `0` | `0` | When the process's RSS reaches this limit, the process terminates. |\n| `soft_rss_limit_mb` | `0` | `0` | When the process's RSS reaches this limit, further allocations fail or return `null` (depending on the value of `allocator_may_return_null`), until the RSS goes back down to allow for new allocations. |\n| `allocator_release_to_os_interval_ms` | `5000` | N/A | Only affects a 64-bit allocator. If set, tries to release unused memory to the OS, but not more often than this interval (in milliseconds). If the value is negative, memory isn't released to the OS. |\n| `abort_on_error` | `true` | `true` | If set, the tool calls `abort()` instead of `_exit()` after printing the error message. |\n\nValidation\n----------\n\nCurrently, there are no CTS tests specifically for Scudo. Instead, make sure\nthat CTS tests pass with or without Scudo enabled for a given binary to verify\nthat it doesn't impact the device.\n\nTroubleshooting\n---------------\n\nIf a non-recoverable issue is detected, the allocator\ndisplays an error message to the standard error descriptor and then terminates the process.\nStack traces that lead to the termination are added in the system log.\nThe output usually starts with `Scudo ERROR:` followed by a\nshort summary of the problem along with any pointers.\n| **Note:** Again, Scudo is meant to be a mitigation. Consider using ASan to determine the root cause of the issue.\n\nHere is a list of the current error messages and their potential\ncauses:\n\n- `corrupted chunk header`: The checksum verification of the chunk header has failed. This is likely due to one of two things: the header was overwritten (partially or totally), or the pointer passed to the function is not a chunk.\n- `race on chunk header`: Two different threads are attempting to manipulate the same header at the same time. This is usually symptomatic of a race-condition or general lack of locking when performing operations on that chunk.\n- `invalid chunk state`: The chunk isn't in the expected state for a given operation, for example, it's not allocated when trying to free it, or it's not quarantined when trying to recycle it. A double free is the typical reason for this error.\n- `misaligned pointer`: Basic alignment requirements are strongly enforced: 8 bytes on 32-bit platforms and 16 bytes on 64-bit platforms. If a pointer passed to our functions does not fit those, the pointer passed to one of the functions is out of alignment.\n- `allocation type mismatch`: When this option is enabled, a deallocation function called on a chunk has to match the type of function that was called to allocate it. This type of mismatch can introduce security issues.\n- `invalid sized delete`: When the C++14 sized delete operator is used, and the optional check is enabled, there's a mismatch between the size that was passed when deallocating a chunk and the size that was requested when allocating it. This is typically a compiler issue or a [type confusion](https://cwe.mitre.org/data/definitions/843.html) on the object being deallocated.\n- `RSS limit exhausted`: The maximum RSS optionally specified has been exceeded.\n\n\nIf you're debugging a crash in the OS itself, you can use a\n[HWASan OS build](/devices/tech/debug/hwasan). If you're\ndebugging a crash in an app, it's possible to use a\n[HWASan app build](https://developer.android.com/ndk/guides/hwasan) too."]]