encyklopedia.space

Code signing (podpisywanie kodu)

Code signing – technika kryptograficzna polegająca na cyfrowym podpisaniu plików wykonywalnych, bibliotek, skryptów lub całych pakietów oprogramowania w celu potwierdzenia ich integralności oraz autentyczności autora. W praktyce proces ten polega na wygenerowaniu skrótu (hash) treści kodu, zaszyfrowaniu go kluczem prywatnym właściciela certyfikatu cyfrowego oraz dołączeniu wyniku jako podpisu do dystrybuowanego pliku.

Historia i rozwój

Podstawy kryptografii asymetrycznej, opracowane w latach 70. XX wieku, umożliwiły stworzenie technologii podpisu elektronicznego, która od lat 90. była adaptowana do potrzeb dystrybucji oprogramowania. Pierwsze implementacje code signing pojawiły się w systemie Microsoft Windows (Authenticode) oraz w środowisku macOS (Gatekeeper). Obecnie standardy takie jak PKI, X.509 oraz RFC 5280 definiują szczegółowe procedury i formaty podpisów.

Cel i zastosowanie

  • Zapewnienie, że kod nie został zmodyfikowany po jego podpisaniu (integralność).
  • Umożliwienie użytkownikowi weryfikacji tożsamości wydawcy (uwierzytelnienie).
  • Ułatwienie automatycznej instalacji i aktualizacji oprogramowania poprzez zaufane certyfikaty cyfrowe.
  • Wsparcie mechanizmów kontroli bezpieczeństwa w systemach operacyjnych, takich jak SmartScreen czy Gatekeeper.

Proces podpisywania kodu

  1. Wygenerowanie skrótu (hash) pliku przy użyciu algorytmu SHA‑256 lub innego zatwierdzonego w standardzie kryptograficznym.
  2. Podpisanie skrótu kluczem prywatnym powiązanym z certyfikatem cyfrowym wydanym przez urząd certyfikacji (CA).
  3. Dołączenie podpisu oraz certyfikatu (oraz łańcucha certyfikatów pośrednich) do pliku w określonym formacie (np. Authenticode, PE Authenticode lub Mach-O).
  4. Dystrybucja podpisanego artefaktu do użytkowników.

Algorytmy i standardy

W code signing najczęściej używane są algorytmy:

  • RSA – tradycyjny algorytm asymetryczny, obsługujący klucze o długościach od 2048 bitów.
  • ECDSA – algorytm oparty na krzywych eliptycznych, oferujący podobny poziom bezpieczeństwa przy krótszych kluczach.
  • DSA – mniej popularny w nowych implementacjach.

Standardy określające formaty podpisów:

Weryfikacja podpisu

Podczas uruchamiania lub instalacji oprogramowania system operacyjny wykonuje następujące kroki:

  1. Odczyt podpisu i certyfikatu z pliku.
  2. Sprawdzenie ważności certyfikatu (data, lista odwołanych certyfikatów CRL lub OCSP).
  3. Weryfikacja, czy łańcuch certyfikatów prowadzi do zaufanego roota znajdującego się w magazynie systemowym.
  4. Obliczenie skrótu pliku i porównanie go z odczytanym ze podpisu.
  5. W przypadku pomyślnej weryfikacji – zezwolenie na uruchomienie; w przeciwnym razie ostrzeżenie lub blokada.

Systemy operacyjne i platformy

Wszystkie główne platformy wspierają code signing:

  • Windows – Authenticode, Windows Defender Application Control.
  • macOS oraz iOS – Gatekeeper, notarisation.
  • Linux – podpisywanie pakietów RPM, DEB, oraz podpisy binarne przy użyciu GPG.
  • Środowiska Java – JAR signing przy pomocy jarsigner.
  • Platformy mobilne (Android) – APK signing wykorzystujący certyfikaty X.509.

Aspekty prawne i regulacyjne

W wielu jurysdykcjach podpis elektroniczny, w tym code signing, jest uznawany za równoważny tradycyjnemu podpisowi odręcznemu, pod warunkiem spełnienia wymogów ustawowych (np. RODO w UE, Ustawa o podpisie elektronicznym w Polsce). Certyfikaty wydawane przez zaufane urzędy certyfikacji muszą spełniać wymogi standardów kryptograficznych oraz przechodzić proces audytu.

Wyzwania i zagrożenia

  • Krótka żywotność kluczy – po wygaśnięciu certyfikatu nową wersję aplikacji trzeba podpisać nowym certyfikatem.
  • Ataki na infrastrukturę CA (np. kradzież klucza prywatnego) mogą doprowadzić do podpisania złośliwego kodu jako zaufanego.
  • Nieprawidłowa konfiguracja łańcucha certyfikatów może spowodować odrzucenie prawidłowego podpisu.
  • Wykorzystywanie przestarzałych algorytmów (MD5, SHA‑1) – niezalecane ze względu na znane kolizje.

Przyszłość

Rozwój standardów TLS 1.3 i kryptografii post‑kwantowej wpływa na procesy wystawiania certyfikatów używanych w code signing. Coraz częściej wprowadza się transparentność certyfikatów (Certificate Transparency) oraz mechanizmy revoke‑on‑demand, aby zwiększyć szybkość reagowania na incydenty bezpieczeństwa.

Przykładowe narzędzia

  • signtool – narzędzie Microsoft do podpisywania i weryfikacji plików PE.
  • codesign – narzędzie Apple do podpisywania aplikacji i rozszerzeń.
  • jarsigner – część JDK do podpisywania archiwów JAR.
  • gpg – używany w ekosystemie Linux do podpisywania pakietów i binariów.

Podsumowanie

Code signing stanowi kluczowy element współczesnego ekosystemu oprogramowania, umożliwiając zarówno deweloperom, jak i użytkownikom weryfikację autentyczności i integralności kodu. Dzięki połączeniu kryptografii asymetrycznej, infrastruktury PKI oraz wsparcia ze strony systemów operacyjnych, technika ta pomaga ograniczyć ryzyko rozpowszechniania złośliwego oprogramowania i buduje zaufanie w procesie dystrybucji aplikacji.