سؤال

لدينا Coverity علة هذا الخط من التعليمات البرمجية:

snprintf( tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value),
A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max));

الخطأ يقول:

non_const_printf_format_string: "format string is not a string literal, 
potential security vulnerability if user controlled"

لقد غيرت testStrings const, ولكن ذلك لم تفعل أي شيء:

static const char *testStrings[] = {"1", ... etc};

أي أفكار ما هذا الخطأ هو حقا تقول ؟

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

المحلول

التعليمات البرمجية الخاصة بك على ما يرام.

المسألة هي أنه إذا كنت تمرير سلسلة المستخدم التحكم مثل printf شكل سلسلة الخلل الأمني يمكن أن تنشأ.

فعلى سبيل المثال ، printf(userName);

حيث يكون userName هو توفيره من قبل المستخدم, يمكن للمستخدم تمرير "%s", والحصول على وظيفة الخاص بك لبدء الوصول إلى البيانات في عنوان عشوائي على المكدس ، الذي يمكن أن يؤدي إلى تحطم الطائرة.printf محاولة البوب معلمات إضافية من المكدس ، مما أدى إلى كومة الفساد.الحرمان من الخدمة الهجوم مثل هذا هو على الارجح أفضل حال ، معلومات يمكن الكشف عنها عن طريق الحصول على printf لتفريغ القيم على كومة بل هناك طرق للحصول على printf وظائف نمط تعديل عنوان المرسل على المكدس.

منذ سلاسل الخاص بك ليست المستخدم التحكم ، فمن آمن تجاهل هذه الرسالة.نموذجية الإصلاح هو استبدال printf المثال أعطى مع printf("%s", userName);, التي لا يبدو للمساعدة في حالتك لأن const سلاسل يبدو أن تحتوي على شكل سلاسل.

ويكيبيديا لديها أكثر على شكل سلسلة نقاط الضعف هنا: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

نصائح أخرى

ويمكن تغيير فكرة أن قيمة testStrings[testID] بطريقة أو بأخرى لتشمل محددات الشكل إضافية.

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

وكما هو معروف هجوم سلسلة تنسيق .

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