Puncte:1

De ce este relevantă implementarea pentru sincronizarea atacurilor?

drapel in

Discuțiile din surse foarte respectate (detalii de mai jos) subliniază importanța implementare a software-ului criptografic la securitatea efectivă oferită, un caz particular fiind sensibilitatea la atacuri de sincronizare.


Clarificare - Contextul este semnarea criptografică a mesajelor non-secrete

Răspunsul inițial al lui @poncho notează că atacatorii nu au întotdeauna luxul de a determina implementarea „utilizatorului”.

De fapt, mă interesează această întrebare tocmai în situația foarte reală în care atacatorul este utilizatorul și are capacitatea de a-și alege propria implementare - în semnarea criptografică a mesajelor non-secrete. Citatul meu de mai jos este despre NaCl, care include o implementare a ed25519. În cazurile de utilizare la care lucrez, puteți presupune că „atacatorul”/utilizatorul are mesajul în text simplu, semnătura și cheia publică. Toate trei sunt necesare pentru ca semnătura să fie chiar utilă. Singurul lucru care le lipsește este cheia privată.


Nu este asta irelevant? În mod logic, un algoritm criptografic este în mod inerent susceptibil la atacuri de sincronizare dacă algoritmul însuși este capabil să identifice un eșec de validare într-un număr mai mic de operațiuni decât este necesar pentru a confirma succesul validării. Cu cât mai multe puncte distincte în care eșecul de validare poate fi determinat matematic, cu atât algoritmul este mai susceptibil.

De exemplu.

  • Dacă un algoritm nu poate determina matematic validitatea unui set de intrări până la pasul final, atunci este în mod inerent imun la atacurile de sincronizare. Înțeleg că toți algoritmii SHA aprobați de NIST începând cu FIPS-180-4 sunt în acest grup.
  • Dacă un algoritm poate identifica matematic o intrare invalidă la fiecare octet/cuvânt/bloc incremental al unui flux procesat, este extrem de sensibil la atacurile de sincronizare.
  • În cel mai rău caz, numărul minim de operațiuni necesare pentru a determina succesul sau eșecul depinde de fiecare bit incremental dintr-o cheie secretă.

Capacitatea oricărei implementări date de a evita sau ignora susceptibilitatea de bază a algoritmului la un atac de sincronizare este logic irelevantă, deoarece un atacator rațional va alege pur și simplu să folosească o implementare care este sensibilă în mod intenționat la atacurile de timp. Chiar dacă majoritatea atacatorilor nu au abilitățile sau motivația de a-și scrie propria implementare, este nevoie doar de una pentru a crea și apoi a distribui o implementare care accentuează atacurile de timp.

De asemenea, dacă un algoritm este în mod inerent imun la atacurile de sincronizare (de exemplu, nu poate determina validitatea sau invaliditatea până la etapa finală), atunci, prin definiție, nu este posibil să se creeze o implementare care este susceptibilă la atacuri de sincronizare, fie intenționat, fie accidental.

Un autor poate fi mândru de orice număr de calități ale implementării lor a unui algoritm, dar nu pare că „rezistența la atacurile de sincronizare” este o calitate semnificativă din punct de vedere logic.

Oare imi scapa ceva aici?

Referință: Daniel Bernstein / NaCl

The secțiunea de caracteristici din documentele pentru originalul lui Daniel Bernstein biblioteca NaCl, care este implementarea de referință a ed25519 algoritmul de semnătură pe care l-au inventat el și coautorii, face mai multe afirmații cu privire la superioritatea lor implementare ceea ce îl face rezistent la atacurile de sincronizare (sublinierea mea):

Fără ramuri dependente de date

... Literatura de specialitate are multe exemple de succes atacuri de sincronizare care a extras chei secrete din aceste părți ale procesorului. NaCl evită în mod sistematic tot fluxul de date de la informații secrete la indicatorul de instrucțiuni și predictorul de ramuri

Nu există indici de matrice dependenți de date

... Literatura de specialitate are mai multe exemple de succes atacuri cache-timing care foloseau informații secrete scurse prin adrese. NaCl evită în mod sistematic tot fluxul de date de la informații secrete la adresele utilizate în instrucțiunile de încărcare și instrucțiunile de stocare

fgrieu avatar
drapel ng
Un model de atac în care atacatorul poate alege implementarea nu este realist. Lasă prea multe căi atacatorului pentru a obține cheia.
Puncte:3
drapel ng

Acesta ar trebui să fie un comentariu (lung), dar nu am spațiu. Este menit să explice de ce ideea de a lăsa atacatorul să aleagă implementarea de bază este prea puternică --- „trivial” rupe orice primitiv.


Pentru orice primitivă criptografică, dacă un atacator dorește să extragă o cheie $k\în \{0,1\}^n$ pentru unii $n$, si poate:

  1. Alegeți mesaje arbitrare (cel puțin mesajele conținute în $\{0,\dots,n-1\}$) în orice primitiv este luat în considerare,

  2. Modificați în mod arbitrar implementare al algoritmului (dar nu și comportamentul de intrare-ieșire al funcției matematice pe care algoritmul o implementează)

  3. Are acces la orice metodă de calitate pentru a măsura timpul

este destul de simplu să modifici implementarea algoritmului pentru a scurge complet cheia secretă $n$ întrebări. Dacă $\mathcal{O}(k, m)$ este primitivul „vechi”, definiți o primitivă „nouă” prin:

Bine m)
    dacă m în {0,...,n-1} și k[m] == 1:
        asteapta(T)
    returnează O(k, m)

Aici, T este o constantă nespecificată care este „suficient de mare”, astfel încât atacatorul să poată măsura în mod fiabil diferența dintre luarea algoritmului $\ll T$ timp, sau $\aproximativ T$ timp pentru a executa. $\mathcal{O}'$ în mod clar are exact același comportament de intrare-ieșire ca $\mathcal{O}$.


Exemplul de mai sus ar trebui să arate că a lăsa atacatorul să aleagă implementarea este a masiv problemă de securitate, chiar dacă se restricționează implementarea pentru a avea exact același comportament de intrare/ieșire ca și funcția dorită. Ca urmare, a fi „susceptibil din punct de vedere matematic la atacuri de sincronizare” nu este bine definit, așa cum orice algoritmul care se bazează pe date „secrete” este susceptibil la atacul de mai sus.

Totuși, aceasta nu este cu adevărat o problemă, deoarece lăsarea atacatorului să aleagă algoritmul utilizat nu este văzută ca o problemă mare în practică (singurul moment în care poate apărea cu adevărat este în cazul atacurilor de tip „comitet de standarde de backdooring”, să spunem ce s-a întâmplat cu DUEL_EC_DRBG , dar ușile din spate de sincronizare par mai proaste decât ușile din spate „Cunosc o cheie secretă”, deoarece poate fi mai ușor pentru alții să observe ușile din spate de sincronizare).

Deși a fi „susceptibil la atacuri de sincronizare” nu este bine definit, există primitive care sunt mai greu de implementat într-un mod în timp constant. Acest lucru înseamnă, în general, unul dintre cele două lucruri:

  1. Suprafața în transformarea de la timp non-constant la timp constant este mare
  2. Este ușor să faci greșeli în transformarea din timp non-constant în timp constant.

Acestea nu sunt însă proprietăți formale ale problemelor, ci sunt observații empirice ale practicienilor. Prima problemă ar putea fi formalizată (în special, într-un decalaj mare între circuitul de dimensiune minimă care calculează ceva și TM-ul de dimensiune minimă din modelul RAM care calculează ceva), dar în mod normal nu văd că oamenii încearcă să facă asta (nu pare că ar fi interesant pentru implementatori).

Puncte:1
drapel my

Nu este asta irelevant? În mod logic, un algoritm criptografic este în mod inerent susceptibil la atacuri de sincronizare dacă algoritmul însuși este capabil să identifice un eșec de validare într-un număr mai mic de operațiuni decât este necesar pentru a confirma succesul validării.

Implementarea este destul de relevantă; orice algoritm care se finalizează în timp mărginit poate fi implementat într-o manieră cu acces constant în timp/memorie constantă; prin urmare, orice astfel de algoritm ar putea fi implementat în siguranță împotriva acestor atacuri pe canale laterale. Desigur, unii algoritmi fac o astfel de implementare ușoară, iar alții o fac destul de costisitoare.

Dacă un algoritm nu poate determina matematic validitatea unui set de intrări până la pasul final, atunci este în mod inerent imun la atacurile de sincronizare.

De fapt, implementarea poate dura timp în funcție de cheia secretă sau de valoarea intermediară secretă.

Dacă un algoritm poate identifica matematic intrare invalidă la fiecare octet/cuvânt/bloc incremental al unui flux procesat, este extrem de sensibil la atacurile de sincronizare.

Nu; implementarea poate decide să renunțe mai devreme sau poate seta un semnal intern „eșuat” și poate continua (și la sfârșit, observați că este setat indicatorul eșuat și gestionați eșecul în acel moment) și da, setarea flag eșuat se poate face în timp constant. Folosirea unui flag eșuat care este verificat la sfârșit este destul de comună pentru implementările în timp constant.

un atacator rațional va alege pur și simplu să folosească o implementare care este sensibilă în mod intenționat la atacurile de timp.

Dacă atacatorul atacă sistemul unui utilizator (care are acces la valoarea secretă), el nu poate cere utilizatorului să treacă la o implementare mai convenabilă (pentru atacator); el trebuie să folosească ceea ce are utilizatorul.

dacă un algoritm este în mod inerent imun la atacurile de sincronizare (de exemplu, nu poate determina validitatea sau invaliditatea până la etapa finală), atunci, prin definiție, nu este posibil să se creeze o implementare care este susceptibilă la atacuri de sincronizare, fie intenționat, fie accidental.

Nu, acest lucru nu este adevărat; ai putea introduce cu ușurință variații de sincronizare care nu au nicio legătură cu valabilitatea sau invaliditatea.

Dacă atacatorul ar putea specifica implementarea pe care o are utilizatorul, ar putea (spune) să specifice una care durează o secundă în plus dacă bitul 0 al valorii secrete a fost 1 - care este ușor de detectat. Și, prin precizarea $n$ diferite implementări, le putea citi pe toate $n$ biți din valoarea secretă - prin urmare, în acest model de atac, nu este posibilă securitate (ceea ce înseamnă că probabil utilizatorii nu vor să aibă încredere orbește în implementările oferite de atacator).

Desigur, dacă atacatorul lucrează pe propriul său sistem, poate rula orice dorește; desigur, din moment ce sistemul său nu are valoarea secretă, niciun canal secundar din acea implementare nu îi spune nimic despre care să nu știe deja.

drapel in
Acestea sunt puncte bune pentru situațiile în care calculele sunt executate pe o mașină în afara controlului atacatorilor. Am adăugat o clarificare la întrebarea mea că mă interesează cel mai mult semnarea criptografică a mesajelor nesecrete. În acest caz, „atacatorul” este utilizatorul, acesta are controlul complet asupra implementării și singurul lucru care le lipsește este cheia privată. Același lucru este valabil pentru orice sistem PKI, cum ar fi certificatele SSL implementate pe internetul public.
poncho avatar
drapel my
@JoshuaHonig: dacă atacatorul poate rula o implementare arbitrară care are acces la cheia privată, de ce nu poate rula o „implementare” care citește cheia privată și o scoate ca „semnătură”? Acest lucru le oferă acces imediat la cheia privată, fără a fi nevoiți să se obosească cu măsurarea oricăror temporizări ale canalului lateral...
poncho avatar
drapel my
@JoshuaHonig: ca și pentru certificatele TLS de pe internet, doar semnatarul (de obicei serverul) are acces la cheia privată; verificatorul (clientul) are acces doar la cheia publică (și astfel nu există valori secrete de scurs)
drapel in
Ca și în cazul oricărui certificat SSL, atacatorul nu are cheia privată. Ei doresc să obțină cheia folosind un atac de sincronizare: Încercați diferiți candidați de cheie privată și vedeți dacă produc semnătura corectă. Dacă algoritmul de semnare este sensibil la atacurile de sincronizare, atunci atacatorul poate folosi o implementare pentru a descoperi cheia privată, rupând astfel fundamental PKI, deoarece acum își pot produce propriile certificate false. Dacă algoritmii de semnare nu sunt susceptibili la atacuri de sincronizare, atunci implementarea este irelevantă, nu? (aceasta este intrebarea mea initiala)
poncho avatar
drapel my
„Dacă algoritmul de semnare este sensibil la atacurile de sincronizare”; din nou, toți algoritmii (cu o valoare secretă) au implementări care sunt sensibile la atacurile de sincronizare. Deci, dacă atacați este „hack în serverul TLS și înlocuiți implementarea semnăturii cu propria dvs.”, da, ați rupt securitatea (de fapt, probabil că există modalități mai ușoare dacă puteți pirata); asta e ideea ta?
drapel in
Pentru a fi specific, dacă `secp256k1` este susceptibil din punct de vedere matematic la atacuri de sincronizare, atunci îmi pot lua timpul dulce pentru a calcula cheia privată a unui portofel BTC de mare valoare și a-i fura soldul. Dacă `rsaEncryption` sau `secp384r1` sunt susceptibile din punct de vedere matematic la atacuri de sincronizare, atunci pot calcula cheia privată a unei CA rădăcină de încredere și pot implementa atacuri man-in-the-middle. Toate acestea sunt posibile fără a pirata nimic, acesta este ideea. În plus, cheile private în aceste cazuri sunt extrem de longevive.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.