سؤال

كنت تريد إنشاء مخصص التي توفر الذاكرة مع السمات التالية:

  • لا يمكن ترحيلها إلى القرص.
  • من الصعب للغاية الوصول من خلال إرفاق مصحح الأخطاء

والفكرة هي أن هذا سوف تحتوي على معلومات حساسة (مثل رخصة المعلومات) والتي ينبغي أن تكون بعيدة عن متناول المستخدم.لقد فعلت المعتاد البحث على الانترنت وسأل بعض الناس عن هذا, ولكن أنا لا يمكن العثور على مكان جيد البداية على هذه المشكلة.

التحديثات

جوش يذكر باستخدام VirtualAlloc لوضع حماية على مساحة الذاكرة.لقد خلق مخصص مخصص ( كما هو موضح أدناه ) لقد وجدت باستخدام VirtualLock وظيفة حدود مقدار الذاكرة لا يمكن تخصيص.يبدو أن هذا هو حسب التصميم على الرغم من.منذ أنا باستخدام الأجسام الصغيرة هذه ليست مشكلة.

//
template<class _Ty>
class LockedVirtualMemAllocator : public std::allocator<_Ty>
{
public:
    template<class _Other>
    LockedVirtualMemAllocator<_Ty>& operator=(const LockedVirtualMemAllocator<_Other>&)
    {   // assign from a related LockedVirtualMemAllocator (do nothing)
        return (*this);
    }

    template<class Other>
    struct rebind {
        typedef LockedVirtualMemAllocator<Other> other;
    };

    pointer allocate( size_type _n )
    {
        SIZE_T  allocLen = (_n * sizeof(_Ty));
        DWORD   allocType = MEM_COMMIT;
        DWORD   allocProtect = PAGE_READWRITE;
        LPVOID pMem = ::VirtualAlloc( NULL, allocLen, allocType, allocProtect );
        if ( pMem != NULL ) {
            ::VirtualLock( pMem, allocLen );
        }
        return reinterpret_cast<pointer>( pMem );
    }
    pointer allocate( size_type _n, const void* )
    {
        return allocate( _n );
    }

    void deallocate(void* _pPtr, size_type _n )
    {
        if ( _pPtr != NULL ) {
            SIZE_T  allocLen = (_n * sizeof(_Ty));
            ::SecureZeroMemory( _pPtr, allocLen );
            ::VirtualUnlock( _pPtr, allocLen );
            ::VirtualFree( _pPtr, 0, MEM_RELEASE );
        }
    }
};

ويستخدم

 //a memory safe std::string
 typedef std::basic_string<char, std::char_traits<char>, 
                           LockedVirtualMemAllocato<char> > modulestring_t;

تيد بيرسيفال يذكر mlock ولكن لا تنفيذ ذلك حتى الآن.

وجدت عملية التشفير نيل فيرغيسون و بروس شنير مفيدة جدا كذلك.

هل كانت مفيدة؟

المحلول

لا يمكنك حقا حماية ضد الوصول إلى الذاكرة.ربما يمكنك منع ترحيل الصفحات إذا كنت تقوم بتشغيل كمسؤول أو النظام, ولكن لا يمكنك منع المشرف أو نظام من قراءة الذاكرة الخاصة بك.حتى إذا كنت يمكن بطريقة ما منع تماما العمليات الأخرى من قراءة الذاكرة الخاصة بك (والتي لا يمكن), عملية أخرى يمكن أن لا تزال تضخ في الواقع موضوع جديد في عملية قراءة الذاكرة بهذه الطريقة.

حتى إذا كنت يمكن بطريقة أو بأخرى تماما تأمين العملية الخاصة بك وضمان أن نظام التشغيل سوف أبدا السماح لأي شخص آخر الوصول إلى العملية الخاصة بك, كنت لا تزال لم يكن لديك الحماية الكاملة.نظام التشغيل بأكمله يمكن أن تكون قيد التشغيل في الجهاز الظاهري الذي يمكن أن يكون مؤقتا وتفتيشها في أي وقت.

لك لا حماية محتويات الذاكرة من صاحب النظام.هوليوود وصناعة الموسيقى تم المؤلم لهذا لسنوات.إذا كان من الممكن أنهم بالفعل أن تفعل ذلك.

نصائح أخرى

على أنظمة Unix يمكنك استخدام mlock(2) تأمين الصفحات في الذاكرة إلى ذاكرة الوصول العشوائي ، ومنعهم استدعائي.

mlock() و mlockall() على التوالي قفل كل أو جزء من الدعوة العملية هي مساحة العنوان الظاهرية في ذاكرة الوصول العشوائي ، ومنع أن الذاكرة من يجري ترحيلها إلى مبادلة المنطقة.

هناك حد لمقدار الذاكرة كل عملية يمكن قفل ، فإنه يمكن أن تظهر مع ulimit -l و تقاس بالكيلو بايت.على النظام الحد الافتراضي هو 32 وكالة: حكومة البحرين توافق في العملية.

إذا كنت في وضع ويندوز ، هناك طرق يمكنك تقييد الوصول إلى الذاكرة ، ولكن قطعا حجب الآخرين ليست قابلة للتنفيذ.إذا كنت على أمل الحفاظ على سرية سرية قراءة كتابة رمز الأمان - الذي يعالج هذه المشكلة في بعض الطول ، ولكن كن على علم بأن لديك أي وسيلة لمعرفة ما إذا كان لديك التعليمات البرمجية قيد التشغيل على الجهاز الحقيقي أو الجهاز الظاهري.هناك مجموعة من Win32 API الأشياء على التعامل مع التشفير التي تتعامل مع هذا النوع من الشيء ، بما في ذلك التخزين الآمن من أسرار الكتاب يتحدث عن ذلك.يمكنك أن تبحث في الانترنت مايكروسوفت CyproAPI لمزيد من التفاصيل ؛ نظام التشغيل المصممين التعرف على هذه المشكلة تحتاج إلى الحفاظ على نص واضح آمنة (مرة أخرى, قراءة كتابة رمز الأمان).

Win32 API وظيفة VirtualAlloc هو مستوى نظام التشغيل الذاكرة مخصص.فإنه يسمح لك تعيين الوصول إلى الحماية ؛ ما يمكن القيام به هو الوصول إلى PAGE_GUARD أو PAGE_NOACCESS, و الوجه الوصول إلى شيء أكثر ودا في حين أن البرنامج يقرأ و إعادة تعيينه بعد ذلك ، ولكن هذا مجرد السرعة سنام إذا كان شخص ما يحاول من الصعب حقا أن نظرة خاطفة على سرك.

في ملخص, انظر التشفير واجهات برمجة التطبيقات على النظام الأساسي الخاص بك, أنها سوف تعالج المشكلة أفضل من شيء كنت هاك نفسك.

دعونا نأخذ هذا قليلا في وقت واحد:

كنت تريد إنشاء مخصص التي توفر الذاكرة التالية سمات:

هذا عادل بما فيه الكفاية.

* cannot be paged to disk.

أنه سيكون من الصعب.بقدر ما أنا على علم ، لا يمكنك تعطيل الظاهري الترحيل كما يتم التعامل معها من قبل نظام التشغيل.إذا كان هناك طريقة, ثم عليك أن تكون استكشاف الكهوف في أحشاء نظام التشغيل.

* is incredibly hard to access through an attached debugger

هل يمكن تشغيله من خلال PGP و تخزينها مشفرة في الذاكرة إلغاء تشفيرها حسب الحاجة.الأداء الهائل ضرب.

والفكرة هي أن هذا سوف تحتوي على معلومات حساسة (مثل رخصة المعلومات) التي ينبغي أن تكون لا يمكن الوصول إليها المستخدم.لقد فعلت المعتاد البحث على الانترنت و طلب بعض الناس حول هذا, ولكن أنا لا يمكن العثور على مكان جيد تبدأ على هذا المشكلة.

إبقاء جميع المعلومات الحساسة خارج الجهاز.على محمل الجد.لا تخزن معلومات حساسة في الذاكرة.كتابة مخصص حذف الروتينية التي من شأنها أن تلقائيا إزالة كافة البيانات من أي مخصصات تقوم بها.لم تسمح العامة الوصول إلى آلة مع المواد الحساسة على ذلك.إذا قمت بإجراء db الوصول ، تأكد من الوصول إلى مطهرة قبل إطلاق النار.فقط الناس مع محددة الإضافية سجل مسموح الوصول.أي مجموعة عامة الوصول.

على الجانب علما, ما هي الطرق الأخرى هناك من الوصول إلى الذاكرة عملية أخرى من ربط المصحح?

أخذ تفريغ الذاكرة.

تثبيت Libsodium ، استخدام آليات تخصيص من قبل #بما في ذلك <sodium.h>

حراسة تخصيص كومة الذاكرة المؤقتة

أبطأ من malloc() والأصدقاء ، فإنها تحتاج إلى 3 أو 4 صفحات اضافية من الذاكرة الظاهرية.

void *sodium_malloc(size_t size);

تخصيص الذاكرة لتخزين البيانات الحساسة باستخدام sodium_malloc() و sodium_allocarray().سوف تحتاج إلى المكالمة الأولى sodium_init() قبل استخدام هذه الكومة الحراس.

void *sodium_allocarray(size_t count, size_t size);

على sodium_allocarray() الدالة بإرجاع مؤشر من عد الأشياء التي هي حجم بايت من الذاكرة كل يمكن الوصول إليها.فإنه يوفر بنفس الضمانات sodium_malloc() ولكن أيضا يحمي ضد تجاوزات عند الحساب count * size يتجاوز SIZE_MAX.

هذه المهام إضافة الحرس صفحات حول حماية البيانات لجعلها أقل من المحتمل أن تكون متاحة في heartbleed-مثل السيناريو.

بالإضافة إلى حماية الذاكرة المناطق المخصصة بهذه الطريقة يمكن تغييرها باستخدام قفل عمليات الذاكرة: sodium_mprotect_noaccess(), sodium_mprotect_readonly() و sodium_mprotect_readwrite().

بعد sodium_malloc يمكنك استخدام sodium_free() لفتح تخصيص الذاكرة.عند هذه النقطة في تنفيذ النظر في التصفير الذاكرة بعد الاستخدام.

صفر الذاكرة بعد الاستخدام

void sodium_memzero(void * const pnt, const size_t len);

بعد استخدام البيانات الحساسة يجب أن تكون الكتابة, ولكن memset() مكتوبة بخط اليد رمز يمكن أن يكون بصمت جردت من قبل أمثلية برنامج التحويل البرمجي أو رابط.

على sodium_memzero() وظيفة يحاول بشكل فعال صفر بايت لين ابتداء من الساعة pnt ، حتى إذا التحسينات تطبيق القانون.

تأمين تخصيص الذاكرة

int sodium_mlock(void * const addr, const size_t len);

على sodium_mlock() وظيفة أقفال على الأقل لين بايت من الذاكرة ابتداء من الساعة addr.هذا يمكن أن يساعد في تجنب تبادل البيانات الحساسة على القرص.

int sodium_mprotect_noaccess(void *ptr);

على sodium_mprotect_noaccess() وظيفة يجعل المنطقة المخصصة باستخدام sodium_malloc() أو sodium_allocarray() لا يمكن الوصول إليها.لا يمكن قراءة أو كتابة ، ولكن البيانات والحفاظ عليها.هذه الوظيفة يمكن استخدامها لجعل بيانات سرية لا يمكن الوصول إليها إلا عند الحاجة فعليا على عملية معينة.

int sodium_mprotect_readonly(void *ptr);

على sodium_mprotect_readonly() وظيفة يمثل المنطقة المخصصة باستخدام sodium_malloc() أو sodium_allocarray() للقراءة فقط.محاولة تعديل البيانات سوف يسبب عملية إنهاء.

int sodium_mprotect_readwrite(void *ptr);

على sodium_mprotect_readwrite() وظيفة يمثل المنطقة المخصصة باستخدام sodium_malloc() أو sodium_allocarray() كما للقراءة والكتابة ، بعد أن كانت محمية باستخدام sodium_mprotect_readonly() أو sodium_mprotect_noaccess().

ما كنت تسأل عنه هو التعامل معها على مستوى نظام التشغيل.بمجرد البيانات في البرنامج الخاص بك هو عرضة تقسيم.

من أجل الوصول إلى الذاكرة ، دوافع الفرد يمكن أن نعلق على الأجهزة مصحح الأخطاء.

@غراهام

هل يمكن تشغيله من خلال PGP و تخزينها مشفرة في الذاكرة إلغاء تشفيرها حسب الحاجة.الأداء الهائل ضرب.

ثم عليك أن الاستمرار على مفتاح في الذاكرة.التي من شأنها أن تجعل الأمر أصعب قليلا ، ولكن بالتأكيد ليس مستحيلا.أحد دوافع لا تزال قادرة على الحصول على البيانات من الذاكرة.

أفضل رهان هو تنفيذ شيء مماثل .صافي SecureString صف تكون حذرا جدا في صفر خارج أي نص عادي نسخة من البيانات الخاصة بك في أقرب وقت كما كنت فعلت (لا تنسى تنظيف حتى عندما يتم طرح الاستثناءات).وهناك طريقة جيدة للقيام بذلك مع std::string و هذا هو استخدام مخصص مخصص.

على النوافذ إذا كنت تستخدم CryptProtectMemory (أو RtlEncryptMemory عن الأنظمة القديمة), تشفير كلمة المرور المخزنة في غير pageable (النواة؟) الذاكرة.في بلدي التجارب ، وهذه الوظائف هي الرتق سريع, esp.مع الأخذ بعين الاعتبار حماية أنها تعطيك.

على أنظمة أخرى ، أود أن استخدام السمكة المنتفخة حيث انها مزيج جيد بين السرعة والقوة.في هذه الحالة عليك أن تولد عشوائيا كلمة المرور الخاصة بك (16+ بايت من الكون على السمكة المنتفخة) في البرنامج عند بدء التشغيل.للأسف, ليس هناك الكثير يمكنك القيام به لحماية كلمة المرور دون دعم نظام التشغيل, على الرغم من أنك قد تستخدم تقنيات التشويش على تضمين الثابت تلوينها قيمة الملح في القابل للتنفيذ التي يمكن أن تتحد مع كلمة المرور (كل قليلا يساعد).

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

لا يمكنك حماية محتويات الذاكرة من صاحب النظام.هوليوود وصناعة الموسيقى تم المؤلم لهذا لسنوات.إذا كان من الممكن أنهم بالفعل أن تفعل ذلك.

هل كان لديك نظرة على ويندوز فيستا (وما فوق) محمية العمليات (مباشر .doc تحميل).أعتقد أن نظام التشغيل القسري الحماية مجاملة من صناعة الترفيه.

@ديريك:لكن مع الحوسبة الموثوقة ، يمكنك استخدام الذاكرة لوقف!:-P</devils-advocate>

@رو

كنت آمل حقا أن ذلك كان ممكنا ، أنا فقط لم تكن قد وجدت بعد.المثال الخاص بك فقط جعلني أدرك أن هذا هو بالضبط ما نحاول القيام به - السماح فقط الوصول إلى الملفات في سياق البرنامج و لذلك الحفاظ على الملكية الفكرية.

أعتقد أنني يجب أن نقبل بأن هناك حقا وسيلة آمنة لتخزين شخص الملفات على جهاز كمبيوتر آخر ، خصوصا إذا كان في مرحلة يتم السماح بالوصول إلى هذا الملف من قبل المالك.

هذا بالتأكيد المشكلة.يمكنك تخزين شيء آمن طالما لم منح الوصول ، ولكن في أقرب وقت كما يمكنك منح الوصول إلى عنصر التحكم الخاص بك هو ذهب.يمكنك أن تجعل الأمر أكثر صعوبة قليلا, لكن هذا كل شيء.

@كريس

لكن مع الحوسبة الموثوقة ، يمكنك استخدام الذاكرة لوقف!:-P

ولكن بعد ذلك عليك أن تكون على استعداد لدفع ثمن جهاز كمبيوتر شخص آخر يملك.:p

@ديريك بارك

وقال فقط الصعب ليس مستحيل.PGP شأنه أن يجعل من الصعب وليس من المستحيل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top