PHP2Shell؛ مقدمه‌ای بر نقش حافظه و Use-After-Free

چرا مهم است

اگر با رفتار حافظه در PHP یا C سروکار داری، این مقدمه نشان می‌دهد چرا آزاد شدن حافظه به معنی بی‌خطر شدن pointer قبلی نیست. مثال متن نشان می‌دهد دسترسی قدیمی چطور ممکن است دادهٔ کاربر دیگری را بخواند یا بر authorization اثر بگذارد.

قبل از خواندن، این‌ها را بدان۳ مفهوم
allocation

اختصاص بخشی از حافظه برای نگهداری داده؛ allocator ممکن است برای این کار از فضای قبلاً آزادشده استفاده کند.

در حال نگارش: allocation

Dangling Pointer

pointer که پس از پایان عمر یک شیء، همچنان آدرس حافظهٔ آن را نگه می‌دارد.

در حال نگارش: Dangling Pointer

Use-After-Free

دسترسی به حافظه پس از آزاد شدن آن؛ اگر فضا دوباره استفاده شده باشد، این دسترسی ممکن است دادهٔ شیء دیگری را بخواند یا تغییر دهد.

در حال نگارش: Use-After-Free

نویسندهٔ یک پژوهش مستقل درباره PHP2Shell می‌خواهد فراتر از توضیح‌های سطحی، رفتار داخلی PHP و روند exploit را بررسی کند. او می‌گوید این نوشته بر برداشت شخصی‌اش از کد PHP،؜ آزمایش‌ها و بررسی‌های خودش تکیه دارد؛ تحلیل رسمی نیست و ممکن است اشتباه‌هایی داشته باشد. بخش در دسترس، مقدمه و مبانی حافظه را پوشش می‌دهد، نه مراحل عملی exploit.

نقطهٔ شروع، تفاوت Stack و Heap و نحوهٔ allocation است. نویسنده توضیح می‌دهد که allocator ممکن است به‌جای گرفتن حافظهٔ تازه، فضای آزادشده را دوباره استفاده کند. در مثال malloc و free،؜ دو allocation متوالی ممکن است آدرس عددی یکسانی داشته باشند؛ هرچند این رفتار تضمین‌شده نیست. همچنین آزاد کردن حافظه الزاماً دادهٔ قبلی را پاک نمی‌کند و مقدار pointer را هم خودکار به NULL تغییر نمی‌دهد.

این وضعیت زمینهٔ ایجاد Dangling Pointer است: pointer همچنان آدرس شیئی را نگه می‌دارد که عمرش پایان یافته است. اگر شیء دیگری در همان محل قرار بگیرد، دسترسی از طریق pointer قدیمی می‌تواند دادهٔ شیء جدید را بخواند یا تغییر دهد. مثال متن، یک ساختار User است که پس از آزاد شدن، فضای آن برای کاربر دیگری استفاده می‌شود. خواندن نام و وضعیت مدیریتی از pointer قدیمی در این مثال می‌تواند به مشاهدهٔ دادهٔ کاربر جدید یا تصمیم نادرست در authorization منجر شود؛ نمونه‌ای از Use-After-Free.

فهرست بخش‌های پژوهش به موضوعاتی مانند تعامل session و کمبود حافظه، نشت آدرس و جعل ساختارهای داخلی PHP اشاره دارد. بااین‌حال، متن ارائه‌شده پیش از توضیح این مراحل قطع می‌شود و جزئیات آن‌ها را نمی‌توان از همین بخش نتیجه گرفت.

نکته کلیدی

به خاطر بسپار که free مقدار pointer را خودکار NULL نمی‌کند و allocator ممکن است همان فضا را دوباره استفاده کند. این بخش را توضیح مبانی Use-After-Free بدان، نه مدرک کافی برای جزئیات exploit در PHP2Shell.

خواندن مقاله اصلی (در زبانه‌ی جدید باز می‌شود)
برچسب‌ها (۳)