UTS #39: Mecanisme de securitate Unicode
Care este contextul amenințărilor și scopul documentului?
Într-o eră în care datele și informațiile circulă la scară globală, sistemurile de calculare se bazează pe un standard unic de codificare a textului.
Din cauza complexității și diversității sistemelor de scriere incluse în acest standard, utilizarea incorectă a caracterelor poate deschide ușa pentru atacuri de securitate.
Acest document tehnic, aprobat de Consiliul Unicode după o analiză riguroasă din partea membrilor și a părților interesate, stabilește mecanisme concrete pentru identificarea și prevenirea acestor vulnerabilități.
Fiind un document stabil, el poate fi folosit ca material de referință sau citat ca standard normativ în alte specificații. Este important de menționat că un Standard Tehnic Unicode (UTS) este o specificație independentă; conformitatea cu Standardul Unicode nu garantează automat conformitatea cu orice UTS.
Citiitorii ar trebui să fie familiarizați cu Raportul Tehnic Unicode #36, „Considerații privind securitatea Unicode”, care oferă ghidaje pentru detectarea și evitarea problemelor de securitate legate de utilizarea acestui standard. Documentul de față specifică exact acele mecanisme descrise în raportul anterior și poate fi aplicat în alte contexte. Pentru informații suplimentare utile în înțelegerea acestui text, se poate consulta secțiunea de referințe. Pentru cea mai recentă versiune a standardului, se poate consulta sursa oficială, iar pentru lista rapoartelor tehnice actuale, există o pagină dedicată.
Orice implementare care susține că respectă această specificație trebuie să se conformeze cu clauzele enumerate mai jos. Aceste cerințe sunt structurate ierarhic, oferind opțiuni flexibile pentru dezvoltatorii care doresc să adapteze profilurile de securitate la necesitățile lor specifice.
Pentru implementările care susțin că aplică Profilul General pentru Identificatoare, conformitatea se obține prin respectarea fie a subclauzei UTS-39-C1-1, fie a UTS-39-C1-2. Prima variantă impune respectarea nealterată a secțiunii 3.1, care definește profilul general de securitate pentru identificatoare. A doua variantă permite implementării să ofere o listă precisă a caracterelor adăugate sau eliminate din profil, păstrând restul conform primelor reguli.
Când o implementare susține că aplică Profilurile de Securitate IDN, trebuie să se conformeze fie cu UTS-39-C1.1-1, fie cu UTS-39-C1.1-2. Prima opțiune cere respectarea strictă a secțiunii 3.2, care detaliază profilurile de securitate IDN pentru identificatoare. A doua opțiune permite modificări documentate ale listei de caractere permise.
Care sunt cerințele de conformitate pentru implementări?
Pentru profilurile de securitate legate de adresele de email, o implementare trebuie să respecte fie UTS-39-C1.2-1, fie UTS-39-C1.2-2. Prima variantă impune respectarea nealterată a secțiunii 3.3. A doua variantă permite o descriere precisă a modificărilor în comportament, conform principiilor din UTS-39-C1.2.
În ceea ce privește funcțiile de detectare a caracterelor confuze (confusables), o implementare trebuie să se conformeze fie cu UTS-39-C2-1, fie cu UTS-39-C2-2. Prima opțiune cere implementarea funcției din secțiunea 4 fără nicio modificare. A doua opțiune permite adăugarea sau eliminarea de mapări de caractere, cu condiția documentării acestor schimbări.
Pentru detectarea scripturilor amestecate, conformitatea se obține prin respectarea fie a UTS-39-C3-1, fie a UTS-39-C3-2. Prima variantă impune respectarea nealterată a secțiunii 5.1. A doua variantă permite o descriere precisă a modificărilor în comportamentul de detectare.
Pentru detectarea nivelurilor de restricție, o implementare trebuie să respecte fie UTS-39-C4-1, fie UTS-39-C4-2. Prima opțiune cere respectarea strictă a secțiunii 5.2.
A doua variantă permite ajustări documentate ale regulilor de restricție.
În final, pentru detectarea numerelor amestecate, o implementare trebuie să se conformeze fie cu UTS-39-C5-1, fie cu UTS-39-C5-2. A doua variantă permite modificări în logica de detectare, cu documentare adecvată.
Identificatoarele sunt șiruri de caractere folosite în contexte aplicative pentru a face referință la entități specifice de o anumită importanță în aplicația respectivă. Într-o anumită aplicație, un identificator se va mapează la cel mult o singură entitate specifică. Multe aplicații au cerințe de securitate legate de identificatoare. Un exemplu comun este reprezentat de adresele URL care indică pagini sau alte resurse pe Internet: atunci când un utilizator dorește să acceseze o resursă, este esențial ca acesta să fie sigur cu ce resursă interacționează.
De ce este importantă securitatea identificatoarelor?
De exemplu, utilizatorul trebuie să știe că este în interacțiune cu un serviciu financiar specific și nu cu o altă entitate care se preface a fi acel serviciu în scopuri malefice.
Acest lucru ilustrează o îngrijire generală de securitate pentru identificatoare: posibila ambiguitate a șirurilor.
Deși o mașină nu are dificultate în a distinge între două secvențe de caractere diferite, ar fi foarte dificil pentru un om să recunoască și să distingă identificatoare dacă aplicația nu ar limita care sunt caracterele Unicode permise în identificatoare.
Focusul acestei specificații este atenuarea acestor probleme legate de securitatea identificatoarelor. Limitarea deliberată a caracterelor care pot fi utilizate în identificatoare este o tehnică de securitate importantă.
Excluderea unor caractere din identificatoare nu afectează utilizarea generală a acestor caractere în alte scopuri, precum textul general în documente. Anexa #31 a Standardului Unicode, „Identificatoarele și Sintaxa Unicode”, oferă o metodă recomandată pentru determinarea care șiruri ar trebui să califice ca identificatoare. Această specificație extinde practica comună de definire a identificatoarelor în termeni de litere și cifre la întregul repertoriu Unicode.
Această specificație permite, de asemenea, altor protocoale să folosească acea metodă ca bază și să definească un profil care adaugă sau elimină caractere.
De exemplu, identificatoarele pentru anumite limbaje de programare adaugă de obicei caractere precum „$” și elimină altele precum „-” (din cauza utilizării ca minus), în timp ce IDNA elimină „_” (printre altele).
Pentru mai multe informații, se pot consulta Standardul Tehnic Unicode #46, „Procesare de compatibilitate IDNA Unicode”, precum și documentele IDNA2003 și IDNA2008.
Ce sunt profilurile de securitate și fișierele?
Acest document prevede profiluri suplimentare pentru identificatoare în medii unde securitatea este o problemă. Acestea sunt profiluri ale identificatoarelor extinse, bazate pe proprietățile și specificațiile Standardului Unicode. Fișierele de date folosite în definirea acestor profiluri urmează Formatul Fișierului UCD, care conține o listă delimitată prin punct și virgulă de câmpuri de date asociate cu caracterele respective, fiecare câmp fiind referit prin număr.
Pentru mai multe detalii despre formatul fișierelor, se poate consulta documentația oficială.
Fișierele din secțiunea dedicată oferă date pentru un profil de identificatoare în medii unde securitatea este o problemă. Aceste fișiere conțin un set de caractere recomandate a fi restricționate din utilizare.
Ele conțin, de asemenea, un mic set de caractere recomandate ca adăugări la lista de caractere definite prin proprietățile XID_Start și XID_Continue, deoarece pot fi utilizate în identificatoare într-un context mai larg decât cel al identificatoarelor din limbaje de programare.
Caracterele restricționate sunt acele caractere care nu sunt în uz comun și pot fi blocate pentru a reduce și mai mult posibilitățile de confuzie vizuală. Ele includ diverse categorii de caractere rare sau cu potențial de confuzie. Alegerea caracterelor de specificat ca restricționate începe conservator, dar permite adăugări în viitor pe măsură ce cerințele pentru caractere se rafinează. Pentru informații despre tratarea modificărilor de-a lungul timpului, se poate consulta secțiunea despre compatibilitate retroactivă.
O implementare care urmează Profilul General pentru Identificatoare nu permite niciun caracter din \p{Identifier_Status=Restricted}, cu excepția cazului în care documentează caracterele suplimentare pe care le permite. Această documentare poate specifica caractere prin proprietăți, cum ar fi \p{Identifier_Type=Technical}, sau prin liste explicite, sau prin combinații ale acestora.
Implementările pot, de asemenea, să specifice că sunt permise mai puține caractere decât cele implicite de \p{Identifier_Status=Allowed}; de exemplu, pot permite doar caracterele permise prin standardul IDNA2008.
Care sunt detaliile tehnice și actualizările?
Candidați frecvenți pentru astfel de adăugări includ caracterele pentru scripturile listate în Tabla 7, Scripturi cu utilizare limitată, din anexa menționată anterior. Cu toate acestea, caracterele din aceste scripturi nu au fost o prioritate pentru examinarea confuziilor sau pentru determinarea caracterelor specializate, nemoderne sau cu utilizare neobișnuită. Echivalența canonică este aplicată la testarea șirurilor candidate pentru includerea caracterelor permise.
De exemplu, dacă șirul candidat este o secvență specifică, șirul țintă ar fi permis în oricare dintre cele două situații descrise. Pentru detalii despre formatul fișierelor, se poate consulta secțiunea despre fișiere de date.
Notă importantă: În versiunea 15.0 a standardului, caracterele de control al uniunii (ZWJ/ZWNJ) au fost eliminate din categoria Identifier_Type=Inclusion. Ele au acum proprietățile Identifier_Type=Default_Ignorable și Identifier_Status=Restricted. Includerea lor în profilurile de identificatoare pentru limbaje de programare are implicații atât de utilizare, cât și de securitate.
Implementările Profilului General pentru Identificatoare care doresc să păstreze ZWJ și ZWNJ ar trebui să declare că folosesc o modificare a profilului conform secțiunii despre conformitate și să se asigure că implementează restricțiile descrise în secțiunea despre controale de uniune.
Proprietățile Identifier_Status și Identifier_Type sunt proprietăți ale caracterelor (puncte de cod). Pentru mai multă discuție despre aceste proprietăți și valorile lor, se pot consulta Standardul Tehnic Unicode #18 despre expresii regulate și Raportul Tehnic Unicode #23 despre modelul de proprietăți ale caracterelor.
Pentru scopul expresiilor regulate, numele lungi și scurte ale acestor proprietăți și valorile lor sunt documentate în mod explicit. Această structură permite dezvoltatorilor să construiască sisteme mai securizate, reducând suprafața de atac pentru confuzii vizuale și alte vulnerabilități legate de codificarea textului.
Prin aplicarea acestor mecanisme, organizațiile pot asigura că utilizatorii interacționează cu resursele corecte, fără a fi înșelați de caractere care par identice, dar au coduri diferite.
Acest standard reprezintă un pas important în consolidarea securității digitale prin standardizarea modului în care caracterele sunt tratate în contexte sensibile.