تجنب حالة السباق عندما مؤكدا أذونات الملف في بايثون

StackOverflow https://stackoverflow.com/questions/2258257

سؤال

تطبيق يريد أن تحليل "تنفيذ" ملف يريد التأكيد على الملف القابل للتنفيذ لأسباب أمنية.

لحظات فكرت وأنت تدرك هذا رمز الأولية لديه حالة السباق الذي يجعل نظام الضمان غير فعالة:

import os

class ExecutionError (Exception):
    pass

def execute_file(filepath):
    """Execute serialized command inside @filepath

    The file must be executable (comparable to a shell script)
    >>> execute_file(__file__)  # doctest: +ELLIPSIS
    Traceback (most recent call last):
        ...
    ExecutionError: ... (not executable)
    """
    if not os.path.exists(filepath):
        raise IOError('"%s" does not exist' % (filepath, ))
    if not os.access(filepath, os.X_OK):
        raise ExecutionError('No permission to run "%s" (not executable)' %
                filepath)

    data = open(filepath).read()

    print '"Dummy execute"'
    print data

حالة السباق بين

os.access(filepath, os.X_OK)

و

data = open(filepath).read()

لأن هناك إمكانية الملف يتم تجاوزها مع غير قابل للتنفيذ ملف من محتويات مختلفة بين هذين نظام المكالمات.

الحل الأول لدي هو تغيير النظام الحرجة المكالمات (و تخطي الآن-زائدة الوجود الاختيار):

fobj = open(filepath, "rb")
if not os.access(filepath, os.X_OK):
    raise ExecutionError('No permission to run "%s" (not executable)' %
            filepath)

data = fobj.read()

يحل هذا السباق الشرط ؟ كيف يمكنني حلها بشكل صحيح ؟

المخطط المنطقي باختصار (ظننت)

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

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

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

قارن هذا إلى نظام التشغيل Mac OS X هو جيد جدا التصميم:"هذا البرنامج تم تحميلها من شبكة الإنترنت ، هل أنت متأكد من أنك تريد فتحه؟".

وذلك في رمزية هذا من حقيقة أن عليك أن chmod +x شل البرامج النصية التي قمت بتحميلها ، فكرت في تصميم في السؤال أعلاه.

إغلاق الكلمات

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

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

المحلول

ويرد executability إلى الملف الذي فتح، وليس هناك شيء وقف عدة ملفات من لافتا إلى inode يحتوي على البيانات التي ترغب في قراءتها. وبعبارة أخرى، قد تكون نفس البيانات قابلة للقراءة من ملف غير قابل للتنفيذ في أي مكان آخر في نفس الملفات. وعلاوة على ذلك، حتى بعد فتح الملف، لا يمكنك منع executability من نفس الملف من تغيير، بل يمكن غير المرتبطة.

وو"أفضل جهد" المتاحة لك كما أرى أنه سيكون من القيام الشيكات باستخدام os.fstat على ملف فتح، ووضع الحماية الاختيار ووقت التعديل قبل وبعد، ولكن في أحسن الأحوال وهذا سوف يقلل فقط إمكانية أن التغيرات الذهاب التي لم يتم كشفها أثناء قراءة الملف.

في أفكار ثانية، إذا كنت المبدع الأصلي للبيانات في هذا الملف، هل يمكن أن تنظر في كتابة inode هذا ما لم ترتبط الملفات في المقام الأول، وهذا أسلوب شائع في تقاسم الذاكرة عبر الملفات. بدلا من ذلك إذا كانت البيانات الواردة يجب جعل في نهاية المطاف الجمهور للمستخدمين الآخرين، يمكنك استخدام قفل الملف، ومن ثم تمديد تدريجيا البتات الحماية لهؤلاء المستخدمين التي تتطلب ذلك.

وأخيرا يجب عليك التأكد من المستخدمين الخبثاء ببساطة لا يملكون حق الوصول إلى الملف.

نصائح أخرى

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

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

وراجع للشغل، انها ليست واضحة بالنسبة لي كيف هذا المخطط، حتى لو كان يمكن إجراؤها على العمل، من شأنه أن يضيف في الواقع أي ورقة مالية - بالتأكيد إذا الأشرار يمكن وضع تسمم المحتوى في ملف انها ليست أبعد منها إلى chmod +x أنها كذلك؟

أفضل ما يمكنك فعله هو :

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

بالطبع هناك سلبيات ولكن إذا كان لديك حالة استخدام بسيط كما يبدو لك أن تقول أنها يمكن أن تفعل خدعة.

ويجب عليك تغيير ملكية الملفات بحيث لا يمكن للمهاجم الوصول إليه "chown الجذر: اسم_الملف الجذر". القيام ب "تطبيق التصريح 700 اسم_الملف" بحيث لا حسابات أخرى يمكن قراءة / الكتابة / تنفيذ الملف. هذا تتجنب المشكلة من TOCTOU كل ذلك معا وهذه هي الطريقة التي تمنع الناس من الملفات التي يجري تعديلها من قبل مهاجم لديه حساب مستخدم على النظام الخاص بك.

وهناك طريقة أخرى للقيام بذلك هي تغيير اسم الملف إلى شيء غير متوقع، أو حتى نسخ الملف بأكمله - إذا لم تكن كبيرة جدا - لدير درجة الحرارة (مشفرة إذا لزم الأمر)، وجعل لكم الشيكات، ثم إعادة تسمية / نسخ الملف مرة أخرى.

وبطبيعة الحال انها عملية كبيرة جدا.

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

وإلا إذا كنت حقا على تشفير الثقيلة، وليس هناك وسيلة لضمان سلامة 100 على الجهاز الذي لا السيطرة عليها.

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