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
- Wygenerowanie skrótu (hash) pliku przy użyciu algorytmu SHA‑256 lub innego zatwierdzonego w standardzie kryptograficznym.
- Podpisanie skrótu kluczem prywatnym powiązanym z certyfikatem cyfrowym wydanym przez urząd certyfikacji (CA).
- 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).
- 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:
- PKCS#7/CMS – kontener podpisu używany m.in. w Authenticode.
- PE Signature – format dla plików PE w systemie Windows.
- Mach-O Signature – format w macOS i iOS.
Weryfikacja podpisu
Podczas uruchamiania lub instalacji oprogramowania system operacyjny wykonuje następujące kroki:
- Odczyt podpisu i certyfikatu z pliku.
- Sprawdzenie ważności certyfikatu (data, lista odwołanych certyfikatów CRL lub OCSP).
- Weryfikacja, czy łańcuch certyfikatów prowadzi do zaufanego roota znajdującego się w magazynie systemowym.
- Obliczenie skrótu pliku i porównanie go z odczytanym ze podpisu.
- 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.