Jak sfałszować podpis elektroniczny, czyli słabość skrótów

Na blogu Lecha Pawłaszka pojawił się wpis o niebezpieczeństwach, jakie niesie ze sobą posługiwanie się funkcjami haszującymi, a konkretnie link do ciekawego, anglojęzycznego artykułu (nie przeoczcie slajdów – jest tam kilka szczegółów).

Kryptografia zawsze mnie pociągała, choć nigdy nie zajmowałem się w szczególny sposób zgłębianiem jej tajników. Wspomniany artykuł okazał się jednak na tyle interesujący, że przysiadłem na chwilę i zacząłem analizować opisany atak. Na skutek tego dumania powstał przepis na sfałszowanie podpisu elektronicznego.

Przepis na sfałszowanie podpisu elektronicznego:

Zacznijmy od tego, że cyfrowe podpisywanie długiego dokumentu jest czynnością na tyle złożoną, że opłaca się zastąpić oryginalny tekst jego skrótem. Skrót ten generuje algorytm haszujący, na przykład MD5. W wyniku działania takiego algorytmu powstaje krótki ciąg danych (suma kontrolna), który stanowi swoisty odcisk palca. Podobnie jak w przypadku daktyloskopii, tak i tu, jest prawie niemożliwe, byśmy spotkali się z dwoma obiektami o tym samym odcisku. Jednak w informatyce „prawie“ robi wielką różnicę. Co prawda na co dzień nie przeszkadza nam, że istnieje nieskończenie wiele plików o tej samej sumie kontrolnej (jest to tak zwana kolizja), bo na ogół są to diametralnie inne pliki, możemy jednak się postarać o dwa prawie identyczne pliki, dla których funkcja haszująca zwróci dokładnie taką samą wartość. Tu jednak „prawie“ zrobi tak wielką różnicę, że podpisując rekomendację dla naszego pracownika, podpiszemy jednocześnie pozwolenie na dostęp do zastrzeżonych informacji naszej firmy.

  1. Wybieramy odpowiedni język opisu dokumentacji, który umożliwi warunkowe wyświetlanie fragmentu tekstu. Autorzy artykułu proponują PostScript, ja posłużę się wyimaginowanym językiem, opartym o C.

  2. Przygotowujemy nagłówek dokumentu, tak byśmy mogli zastosować instrukcję warunkową:


    // Instrukcje inicjalizujące naszego języka
    // Haczyk:
    X=

  3. Znajdujemy dwa ciągi znaków: R1 i R2, takie, że po doklejeniu do nagłówka R1 albo R2 otrzymujemy dwie zawartości o takiej samej sumie kontrolnej:


    // Instrukcje inicjalizujące naszego języka
    // Haczyk:
    X="ciąg_R1";

    oraz:


    // Instrukcje inicjalizujące naszego języka
    // Haczyk:
    X="ciąg_R2";

    Podobno znalezienie takiej, niezbyt długiej, kolizji to kwestia kilku godzin pracy PC-ta.

  4. Do obu dokumentów doklejamy dalszą część, otrzymując tekst, który damy do podpisu:


    // Instrukcje inicjalizujące naszego języka
    // Haczyk:
    X="ciąg_R1";
    // Dalsza część jest stała dla obu plików:
    Y="ciąg_R1";
    if (X==Y)
      print("vmario jest OK.");
    else
      print("Upoważniam vmario do korzystania z serwerów naszej firmy. Proszę podać mu wszystkie hasła.");

    oraz to, co posłuży nam do niecnych celów:


    // Instrukcje inicjalizujące naszego języka
    // Haczyk:
    X="ciąg_R1";
    // Dalsza część jest stała dla obu plików:
    Y="ciąg_R2";
    if (X==Y)
      print("vmario jest OK.");
    else
      print("Upoważniam vmario do korzystania z serwerów naszej firmy. Proszę podać mu wszystkie hasła.");

    Należy zauważyć, że do obu dokumentów doklejamy to samo, tak, by nie zmienić sumy kontrolnej.

  5. Wysyłamy do szefa pierwszy dokument z prośbą o podpis. Jeżeli ofiara otworzy dokument w standardowy sposób, to znaczy nie sprawdzi źródła, zobaczy tylko tekst z rekomendacją. Podpisując go, w rzeczywistości podpisze tylko skrót, a więc tym samym ofiaruje nam sygnaturę także do niecnego upoważnienia.

  6. Odpowiedniej osobie wysyłamy drugi dokument wraz z sygnaturą. W ten sposób uzyskujemy wymarzone hasła.

Proste? Myślę, że proste. Nigdy nie posługiwałem się elektronicznym podpisem, ale myślę, że przynajmniej w przybliżeniu, dobrze to opisałem. Sprawdziłem również sumy kontrolne plików spreparowanych przez autorów artykułu, są takie same:


[vmario@pingwinek md5_atak]$ md5sum letter_of_rec.ps order.ps
a25f7f0b29ee0b3968c860738533a4b9 letter_of_rec.ps
a25f7f0b29ee0b3968c860738533a4b9 order.ps

Piękne. Równie piękne jest to:


[vmario@pingwinek md5_atak]$ cmp -l letter_of_rec.ps order.ps
 84 227  27
110 243  43
111 170 171
124 132 332
148 310 110
174 330 130
188 157 357

Tylko dwadzieścia jeden bajtów różnicy, a jak otwieram pliki w przeglądarce postscriptowej, widzę dwa zupełnie różne listy!

Hmmm… Konkluzja? Zanim coś podpiszesz, obejrzył źródło. Zanim uwierzysz w podpis, obejrzyj źródło.

Komentarzy: 7 do „Jak sfałszować podpis elektroniczny, czyli słabość skrótów“

  1. NetMan komentuje:

    dobre dobre.. ale mi się chyba nie przyda…
    Tak poza tym to weź znajdź kogoś z kim będe mógł na Ciebei na Twoim blogu bluzgać… bo chyba tylko ja ten blog czytam :P

  2. vmario komentuje:

    Już się czaję, żeby tu i ówdzie linki do mojego bloga wcisnąć. Póki co, rzeczywiście tylko Ty i Genpa komentujecie.

  3. Pani Całka komentuje:

    a ja?? (od czasu doczasu, jak sobie przypomnę:P )

  4. Genpa komentuje:

    Ja czytam znaczy eee szukam OBRAZKOW I KURDE NIE MA ;p

  5. vmario komentuje:

    Hmmm… No tak… Ale możesz wpaść na jedną z moich ulubionych stron. Tam jest trochę ładnych obrazków ;-)

  6. Genpa komentuje:

    http://www.fredart.com/fredart/artpage.php3?fn=19&ft=sk niech ci oczy wypali i zajawki dostaniesz i o – a nie tu mi smurfy jakiscie

  7. vmario komentuje:

    Czemu ja tak nie umiem rysować? Czemu ja w ogóle nie umiem rysować?! >-(

Dodawanie komentarzy

XHTML: Możesz używać tagów: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre lang="" line="" escaped="">