خدمات أمان الشبكة (
NSS ) هي مجموعة من المكتبات المستخدمة في التطوير عبر الأنظمة الأساسية لتطبيقات العميل والملقم الآمنة.
توفر حزمة NSS ، بالإضافة إلى OpenSSL ، القدرة على استخدام الأدوات المساعدة لسطر الأوامر لتنفيذ وظائف PKI المختلفة (إنشاء المفاتيح وإصدار شهادات x509v3 والعمل مع التوقيعات الإلكترونية ودعم TLS وما إلى ذلك). تتيح لك إحدى هذه الأدوات المساعدة ، وهي Pretty-print (PP) ، عرض محتويات كل من شهادة x509 v3 والتوقيع الإلكتروني (pkcs # 7) ، وما إلى ذلك. علاوة على ذلك ، يمكن أن تكون الشهادة في كل من ترميزات DER و PEM:
bash-4.3$ pp -h Usage: pp [-t type] [-a] [-i input] [-o output] [-w] [-u] Pretty prints a file containing ASN.1 data in DER or ascii format. -t type Specify input and display type: public-key (pk), certificate (c), certificate-request (cr), certificate-identity (ci), pkcs7 (p7), crl or name (n). (Use either the long type name or the shortcut.) -a Input is in ascii encoded form (RFC1113) -i input Define an input file to use (default is stdin) -o output Define an output file to use (default is stdout) -w Don't wrap long output lines -u Use UTF-8 (default is to show non-ascii as .) bash-4.3$
علاوة على ذلك ، فإن وجود المعلمة –u (ترميز UTF-8) يسمح بعرض الشهادة بالترميز الروسي. ولكن
بالنظر بعناية إلى لقطات شاشة واجهة المستخدم الرسومية لأدوات سطر الأوامر لحزمة NSS ، تلاحظ أن بعض بيانات الشهادة اختفت ببساطة:

بدأ البحث عن المعلومات المفقودة. تم إطلاق الأداة المساعدة "الطباعة اللطيفة" (وهي كيفية ترجمة الطباعة الجميلة) لعرض الشهادة الجذرية لرئيس المرجع المصدق بوزارة الاتصالات في سطر الأوامر:
$pp – certificate –u –i _.cer … Subject: "CN= ,INN=007710474375,OGRN=1047702026701,O= ,STREET="125375 . , . , . 7",L=,ST=77 . ,C=RU,E=dit@minsvya z.ru" …. $
أكدت النتيجة فقدان البيانات. علاوة على ذلك ، ظهر رمزان غير قابلين للعرض على الشاشة (دالتون من جانب أسود اللون مع علامة استفهام؟ في الداخل). أظهر التحليل أن هذه الأحرف غير القابلة للعرض لها رمزان 0xD0 و 0xBE ، على التوالي:

اختفى الحرف الروسي "o" بتمثيل سداسي عشري في ترميز UTF-8 كـ 0xD00xBE. والرموز 0xD0 و 0xBE هي أحرفنا غير القابلة للعرض. وأي نوع من الأحرف ظهر بين هذه البايت؟ وهذه رموز محاذاة طباعة "جميلة" للنص المطبوع.
ماذا حدث؟ يتلقى إدخال الطباعة "اللطيفة" (file / nss/cmd/lib/secutil.c ، الوظيفة secu_PrintRawStringQuotesOptional) البيانات في شكل SECITEM ، أي عناوين لكل صفيف بايت وطوله:
for (i = 0; i < si->len; i++) { unsigned char val = si->data[i]; unsigned char c; if (SECU_GetWrapEnabled() && column > 76) { SECU_Newline(out); SECU_Indent(out, level); column = level * INDENT_MULT; } if (utf8DisplayEnabled) { if (val < 32) c = '.'; else c = val; } else { c = printable[val]; } fprintf(out, "%c", c); column++; }
وإذا تم توفير (SECU_GetWrapEnabled () == True) لطباعة لطيفة (لا تحتوي الأداة المساعدة PP على معلمة –w) وتجاوز عدد وحدات البايت في سطر 76 (العمود> 76) ، فبعد الحرف التالي سطر جديد (SECU_Newline) والمسافة البادئة اللازمة (SECU_Indent ) في الوقت نفسه ، لم يعتقد أي من المطورين أنه إذا تم استخدام ترميز UTF-8 (utf8DisplayEnabled) ، فلا يمكن تحفيز الجمال إلا بعد الحرف التالي ، وليس بايت ، لأن مفهوم البايت والحرف في ترميز UTF-8 قد لا يتزامن . إذا تحدثنا عن الحروف الروسية ، فسيتم
ترميز كل منها
في وحدتي بايت. حدثت مثل هذه الفجوة تمامًا بحرفنا الروسي "o" (0xD00xBE).
ما هو المخرج؟ كل شيء بسيط للغاية بما يكفي في الدالة secu_PrintRawStringQuotesOptional لاستبدال الخط:
if (SECU_GetWrapEnabled() && column > 76) {
على سطر من النموذج التالي:
if (SECU_GetWrapEnabled() && column > 76 && (val <= 0x7F || val == 0xD0 || val == 0xD1)) {
إذا قمت الآن بإعادة بناء الأداة المساعدة PP وتثبيتها في النظام ، فإن الطباعة "اللطيفة" ستبرر اسمها "للغة الروسية العظيمة والقوية والصادقة والحرة!" (آي إس تورجنيف):

إذا تحدثنا عن جمال الطباعة ، فسيكون من الممكن إضافة الواصلة ليس فقط من خلال عدد الأحرف في السطر ، ولكن الأصح ، على سبيل المثال ، من خلال المسافة والفاصلة والقولون والشخصيات الأخرى. أنا لا أتحدث عن التحليل الدلالي للنقل. ولكن هذا بالفعل مجال الذكاء الاصطناعي.
وأخيرًا ، هذا هو عدم الدقة الثانية المكتشفة في أدوات NSS. تم اكتشاف الأول في أداة
oidcalc .