Layanan Keamanan Jaringan dan Utilitas Cukup-cetak

Network Security Services ( NSS ) adalah seperangkat perpustakaan yang digunakan dalam pengembangan lintas-platform aplikasi klien dan server yang aman.

Paket NSS, seperti OpenSSL, menyediakan kemampuan untuk menggunakan utilitas baris perintah untuk mengimplementasikan berbagai fungsi PKI (pembuatan kunci, menerbitkan sertifikat x509v3, bekerja dengan tanda tangan elektronik, dukungan TLS, dll.). Salah satu utilitas ini, yaitu Pretty-print (PP), memungkinkan Anda untuk dengan mudah melihat konten sertifikat x509 v3 dan tanda tangan elektronik (pkcs # 7), dll. Selain itu, sertifikat dapat berupa penyandian DER dan 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$ 

Selain itu, keberadaan parameter –u (pengkodean UTF-8) memungkinkan untuk melihat sertifikat dalam pengkodean Rusia. Tapi melihat dengan seksama screenshot dari GUI ke utilitas baris perintah dari paket NSS, Anda melihat bahwa beberapa data sertifikat hilang begitu saja:

gambar

Pencarian informasi yang hilang dimulai. Utilitas β€œcute print” (yang merupakan cara Pretty-print diterjemahkan) untuk melihat sertifikat root dari Kepala CA dari Kementerian Komunikasi diluncurkan pada baris perintah:

 $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" …. $ 

Hasilnya mengkonfirmasi hilangnya data. Selain itu, dua simbol yang tidak dapat ditampilkan muncul di layar (belah ketupat warna hitam dengan tanda tanya? Di dalam). Analisis menunjukkan bahwa karakter yang tidak dapat ditampilkan ini masing-masing memiliki kode 0xD0 dan 0xBE:

gambar

Huruf Rusia "o" menghilang dengan representasi heksadesimal dalam pengkodean UTF-8 sebagai 0xD00xBE. Dan kode 0xD0 dan 0xBE adalah karakter yang tidak dapat ditampilkan. Dan karakter seperti apa yang muncul di antara byte-byte ini? Dan ini adalah "cantik" cetak - simbol pelurusan teks yang dicetak.

Apa yang terjadi Input dari cetakan "nice" (file /nss/cmd/lib/secutil.c, fungsi secu_PrintRawStringQuotesOptional) menerima data dalam bentuk SECITEM, yaitu. alamat per byte array dan panjangnya:

  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++; } 

Dan jika (SECU_GetWrapEnabled () == Benar) disediakan untuk pencetakan yang bagus (utilitas PP tidak memiliki parameter -w) dan jumlah byte dalam garis melebihi 76 (kolom> 76), maka setelah karakter berikutnya baris baru (SECU_Newline) dan indentasi yang diperlukan (SECU_Indent ) Pada saat yang sama, tidak ada pengembang yang berpikir bahwa jika pengkodean UTF-8 digunakan (utf8DisplayEnabled), maka keindahan hanya dapat diinduksi setelah karakter berikutnya, dan bukan byte, karena konsep byte dan karakter dalam pengkodean UTF-8 mungkin tidak bersamaan. . Jika kita berbicara tentang huruf Rusia, maka masing-masing dikodekan dalam dua byte. Kesenjangan seperti itu terjadi dengan huruf Rusia kami "o" (0xD00xBE).

Apa jalan keluarnya? Semuanya cukup sederhana di fungsi secu_PrintRawStringQuotesOptional untuk mengganti baris:

 if (SECU_GetWrapEnabled() && column > 76) { 

pada garis bentuk berikut:

 if (SECU_GetWrapEnabled() && column > 76 && (val <= 0x7F || val == 0xD0 || val == 0xD1)) { 

Jika Anda sekarang membangun kembali utilitas PP dan menginstalnya dalam sistem, maka cetakan "bagus" akan membenarkan namanya untuk "bahasa Rusia yang hebat, kuat, jujur, dan gratis!" (I.S. Turgenev):

gambar

Jika kita berbicara tentang keindahan pencetakan, dimungkinkan untuk menambahkan tanda hubung tidak hanya dengan jumlah karakter dalam garis, tetapi lebih tepat, misalnya, berdasarkan spasi, koma, titik dua, dan karakter lainnya. Saya tidak berbicara tentang analisis semantik transfer. Tapi ini sudah merupakan area kecerdasan buatan.

Dan akhirnya, ini adalah ketidakakuratan kedua yang ditemukan dalam utilitas NSS. Yang pertama ditemukan di utilitas oidcalc .

Source: https://habr.com/ru/post/id406037/


All Articles