{"id":4783,"date":"2026-08-11T20:59:03","date_gmt":"2026-08-11T18:59:03","guid":{"rendered":"https:\/\/www.sycope.com\/?post_type=dictionary-item&#038;p=4783"},"modified":"2026-08-12T19:01:51","modified_gmt":"2026-08-12T17:01:51","slug":"ja3-ja4-fingerprinting","status":"publish","type":"dictionary-item","link":"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/ja3-ja4-fingerprinting","title":{"rendered":"JA3 \/ JA4 Fingerprinting"},"content":{"rendered":"<p><strong>JA3 \/ JA4 Fingerprinting<\/strong> to techniki, kt\u00f3re tworz\u0105 sta\u0142y \u201eodcisk&#8221; klienta lub serwera <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/tls-ssl\">TLS<\/a> na podstawie tego, jak negocjuje on szyfrowane po\u0142\u0105czenie. Odcisk powstaje z jawnych, jeszcze niezaszyfrowanych p\u00f3l pierwszych pakiet\u00f3w po\u0142\u0105czenia \u2014 <code>ClientHello<\/code> i <code>ServerHello<\/code> (wersja TLS, lista szyfr\u00f3w, rozszerzenia, obs\u0142ugiwane krzywe, ALPN). Dzi\u0119ki temu mo\u017cna rozpozna\u0107 typ aplikacji, u\u017cyt\u0105 bibliotek\u0119 TLS albo rodzin\u0119 <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/malware\">malware<\/a> bez odszyfrowywania tre\u015bci po\u0142\u0105czenia. JA3 powsta\u0142o w firmie Salesforce, a JA4+ \u2014 jego nast\u0119pca \u2014 w firmie FoxIO.<\/p>\n<h2>Jak dzia\u0142a fingerprinting TLS?<\/h2>\n<p>Ka\u017cde po\u0142\u0105czenie TLS zaczyna si\u0119 od kr\u00f3tkiej \u201erozmowy wst\u0119pnej&#8221; (handshake), kt\u00f3ra idzie jeszcze otwartym tekstem. Klient wysy\u0142a pakiet <code>ClientHello<\/code> i deklaruje w nim, jakie wersje protoko\u0142u obs\u0142uguje, jak\u0105 ma list\u0119 szyfr\u00f3w (cipher suites), jakie rozszerzenia (extensions) i krzywe, oraz jaki protok\u00f3\u0142 aplikacji chce negocjowa\u0107 (ALPN \u2014 Application-Layer Protocol Negotiation). Te dane s\u0105 widoczne, zanim powstanie klucz sesji.<\/p>\n<p>Ka\u017cda implementacja TLS \u2014 przegl\u0105darka, biblioteka, agent czy narz\u0119dzie \u2014 uk\u0142ada te warto\u015bci w troch\u0119 inny, charakterystyczny spos\u00f3b. Odcisk TLS to po prostu skr\u00f3t (hash) tej kombinacji. To troch\u0119 jak rozpozna\u0107 kogo\u015b po sposobie m\u00f3wienia, a nie po tre\u015bci: ten sam typ klienta daje ten sam odcisk niezale\u017cnie od tego, z jakim adresem IP, portem czy certyfikatem si\u0119 \u0142\u0105czy.<\/p>\n<h2>Jak liczy si\u0119 JA3?<\/h2>\n<p>JA3 buduje odcisk z pakietu <code>ClientHello<\/code>. Z jego p\u00f3l wyci\u0105ga si\u0119 warto\u015bci liczbowe i skleja w jeden ci\u0105g, zawsze w tej samej kolejno\u015bci:<\/p>\n<ol>\n<li>wersja TLS,<\/li>\n<li>lista szyfr\u00f3w (cipher suites),<\/li>\n<li>lista rozszerze\u0144 (extensions),<\/li>\n<li>obs\u0142ugiwane krzywe eliptyczne (elliptic curves),<\/li>\n<li>formaty punkt\u00f3w krzywych (EC point formats).<\/li>\n<\/ol>\n<p>Pola rozdziela si\u0119 przecinkiem, a warto\u015bci w polu \u2014 my\u015blnikiem, np. <code>769,47-53-5-10-...,0-23-65281-10-11-...,29-23-24,0<\/code>. Tak z\u0142o\u017cony ci\u0105g jest haszowany algorytmem <strong>MD5<\/strong>, co daje 32-znakowy odcisk. Warto\u015bci <code>GREASE<\/code> (mechanizm z RFC 8701, kt\u00f3ry celowo wstrzykuje \u201elosowe&#8221; wpisy) s\u0105 pomijane, \u017ceby klienci ich u\u017cywaj\u0105cy dawali mimo to stabilny hash. Odpowiednikiem po stronie serwera jest <strong>JA3S<\/strong>, liczony z pakietu <code>ServerHello<\/code> (wersja, wybrany szyfr, rozszerzenia).<\/p>\n<h2>Jak liczy si\u0119 JA4 i co obejmuje suite JA4+?<\/h2>\n<p>JA4 to nowsza wersja odcisku <code>ClientHello<\/code>, zaprojektowana tak, by by\u0142a czytelna dla cz\u0142owieka i odporniejsza na zmiany w klientach. Ma format z trzech cz\u0119\u015bci, <code>a_b_c<\/code>:<\/p>\n<ul>\n<li><strong>Cz\u0119\u015b\u0107 a<\/strong> \u2014 czytelne metadane: protok\u00f3\u0142 (<code>t<\/code> dla TLS po TCP, <code>q<\/code> dla <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/quic\">QUIC<\/a>, <code>d<\/code> dla DTLS), wersja TLS (np. <code>13<\/code>), czy podano nazw\u0119 domeny (<code>d<\/code>) czy adres IP (<code>i<\/code>), liczba szyfr\u00f3w, liczba rozszerze\u0144 i dwa znaki z pierwszego ALPN.<\/li>\n<li><strong>Cz\u0119\u015b\u0107 b<\/strong> \u2014 12-znakowy, skr\u00f3cony hash <strong>SHA256<\/strong> z <strong>posortowanej<\/strong> listy szyfr\u00f3w.<\/li>\n<li><strong>Cz\u0119\u015b\u0107 c<\/strong> \u2014 12-znakowy, skr\u00f3cony hash SHA256 z <strong>posortowanej<\/strong> listy rozszerze\u0144 (bez SNI i ALPN) wraz z list\u0105 algorytm\u00f3w podpisu.<\/li>\n<\/ul>\n<p>Najwa\u017cniejsza r\u00f3\u017cnica wobec JA3: JA4 <strong>sortuje<\/strong> szyfry i rozszerzenia, wi\u0119c losowa kolejno\u015b\u0107 rozszerze\u0144 nie psuje ju\u017c odcisku. <strong>JA4+<\/strong> to ca\u0142y zestaw (suite) odcisk\u00f3w dla r\u00f3\u017cnych protoko\u0142\u00f3w i warstw, m.in. <code>JA4<\/code> (klient TLS), <code>JA4S<\/code> (odpowied\u017a serwera TLS), <code>JA4H<\/code> (nag\u0142\u00f3wki <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/http-https\">HTTP<\/a>), <code>JA4L<\/code> (lokalizacja\/<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/latency-opoznienie\">op\u00f3\u017anienie<\/a>), <code>JA4X<\/code> (certyfikaty X.509) oraz <code>JA4T<\/code> i <code>JA4SSH<\/code>. Cz\u0142ony mo\u017cna \u0142\u0105czy\u0107 i wyszukiwa\u0107 po fragmentach (np. tylko <code>a<\/code> i <code>c<\/code>), co pomaga w threat huntingu, czyli aktywnym szukaniu zagro\u017ce\u0144 w ruchu.<\/p>\n<h2>Czym r\u00f3\u017cni si\u0119 JA3 od JA4?<\/h2>\n<ul>\n<li><strong>Format:<\/strong> JA3 to jeden 32-znakowy hash MD5; JA4 to czytelny ci\u0105g <code>a_b_c<\/code> z jawnymi metadanymi i skr\u00f3conymi hashami SHA256.<\/li>\n<li><strong>Kolejno\u015b\u0107 p\u00f3l:<\/strong> JA3 zale\u017cy od kolejno\u015bci rozszerze\u0144 w <code>ClientHello<\/code>; JA4 je sortuje, wi\u0119c nie przeszkadza mu ich losowanie.<\/li>\n<li><strong>Zakres:<\/strong> JA3 obejmuje tylko TLS po TCP; JA4 rozr\u00f3\u017cnia TCP, QUIC i DTLS, a ca\u0142y zestaw JA4+ pokrywa te\u017c HTTP, certyfikaty i SSH.<\/li>\n<li><strong>Czytelno\u015b\u0107:<\/strong> JA3 to sam hash i nic z niego nie wida\u0107; JA4 pokazuje cz\u0119\u015b\u0107 cech (protok\u00f3\u0142, wersj\u0119, SNI, ALPN) wprost.<\/li>\n<\/ul>\n<h2>Dlaczego JA3\/JA4 s\u0105 wa\u017cne dla bezpiecze\u0144stwa?<\/h2>\n<p>Prawie ca\u0142y dzisiejszy ruch sieciowy jest szyfrowany, wi\u0119c klasyczna inspekcja pakiet\u00f3w niewiele widzi bez odszyfrowywania. Fingerprinting TLS odzyskuje cz\u0119\u015b\u0107 tej widoczno\u015bci, bo pracuje na jawnych metadanych handshake \u2014 nie zagl\u0105da do tre\u015bci. W praktyce u\u017cywa si\u0119 go do kilku rzeczy:<\/p>\n<ul>\n<li><strong>Wykrywanie malware i kana\u0142\u00f3w C2 (<a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/c2-cc-command-and-control\">Command and Control<\/a>, czyli zdalnego sterowania zainfekowanymi maszynami):<\/strong> wiele rodzin malware u\u017cywa specyficznych bibliotek TLS, wi\u0119c daje charakterystyczny odcisk \u2014 rozpoznawalny mimo zmiany IP, domeny czy certyfikatu. Po\u0142\u0105czenie odcisku klienta i serwera (JA3+JA3S albo JA4+JA4S) podnosi trafno\u015b\u0107, bo opisuje ca\u0142\u0105 par\u0119 negocjacji.<\/li>\n<li><strong>Klasyfikacja ruchu i wykrywanie anomalii:<\/strong> odciski pozwalaj\u0105 grupowa\u0107 klient\u00f3w, wychwytywa\u0107 niezgodno\u015b\u0107 deklarowanego User-Agenta z faktycznym stosem TLS i odr\u00f3\u017cnia\u0107 boty oraz skanery od zwyk\u0142ych przegl\u0105darek.<\/li>\n<li><strong>Wzbogacanie telemetrii dla <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/soc-security-operations-center\">SOC<\/a>, <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/ndr-network-detection-and-response\">NDR<\/a> i <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/siem\">SIEM<\/a>:<\/strong> odcisk jako dodatkowy atrybut przep\u0142ywu (flow) u\u0142atwia \u0142\u0105czenie zdarze\u0144, przeszukiwanie historii i pisanie regu\u0142 wykrywania.<\/li>\n<\/ul>\n<p>W modelu <strong>Pyramid of Pain<\/strong> (kt\u00f3ry porz\u0105dkuje wska\u017aniki ataku wed\u0142ug tego, jak bardzo bol\u0105 atakuj\u0105cego przy podmianie) odcisk negocjacji TLS jest trudniejszy do zmiany ni\u017c adres IP czy hash pliku, wi\u0119c podnosi koszt dzia\u0142ania napastnika. Technika dobrze uzupe\u0142nia si\u0119 z <strong><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/encrypted-traffic-analysis-eta\">Encrypted Traffic Analysis<\/a> (ETA)<\/strong> \u2014 analiz\u0105 zaszyfrowanego ruchu, kt\u00f3ra z metadanych i cech statystycznych wnioskuje o charakterze po\u0142\u0105czenia bez odszyfrowywania.<\/p>\n<h2>Jakie s\u0105 ograniczenia JA3\/JA4?<\/h2>\n<ul>\n<li><strong>Randomizacja rozszerze\u0144:<\/strong> od Chrome 110 i Firefox 114 przegl\u0105darki losuj\u0105 kolejno\u015b\u0107 rozszerze\u0144 TLS, wi\u0119c ten sam klient potrafi dawa\u0107 r\u00f3\u017cne hashe JA3 \u2014 przez to JA3 sta\u0142 si\u0119 niestabilny. JA4 rozwi\u0105zuje to sortowaniem.<\/li>\n<li><strong>Kolizje i brak unikalno\u015bci:<\/strong> odcisk wskazuje implementacj\u0119 lub bibliotek\u0119, a nie konkretny komputer czy osob\u0119; r\u00f3\u017cne aplikacje oparte na tej samej bibliotece mog\u0105 mie\u0107 identyczny odcisk.<\/li>\n<li><strong>Podszywanie si\u0119:<\/strong> atakuj\u0105cy mog\u0105 celowo na\u015bladowa\u0107 <code>ClientHello<\/code> popularnej przegl\u0105darki (TLS mimicry), \u017ceby ukry\u0107 swoje narz\u0119dzie pod znanym, \u201eniewinnym&#8221; odciskiem.<\/li>\n<li><strong>Potrzebny jawny handshake:<\/strong> mechanizm Encrypted ClientHello (ECH) szyfruje cz\u0119\u015b\u0107 pakietu <code>ClientHello<\/code>, wi\u0119c zostaje mniej danych do odcisku.<\/li>\n<li><strong>To wskaz\u00f3wka, nie wyrok:<\/strong> sam odcisk jest sygna\u0142em, a nie dowodem \u2014 trzeba go zestawia\u0107 z innymi (reputacja, wolumen, regularne \u201epukanie&#8221; do serwera, czyli <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/beaconing\">beaconing<\/a>).<\/li>\n<\/ul>\n<h2>Dowiedz si\u0119 wi\u0119cej<\/h2>\n<ul>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/arp-spoofing-jak-wykryc-atak-man-in-the-middle-i-zatruwanie-arp-w-sieci-lan\">ARP Spoofing \u2013 jak wykry\u0107 atak Man-in-the-Middle i zatruwanie ARP w sieci LAN<\/a> \u2014 Pokazuje atak MITM na warstwie \u0142\u0105cza, podczas gdy JA3\/JA4 opisuj\u0105 fingerprint TLS na warstwie aplikacji.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/monitoring-sieci-i-network-visibility-analiza-ruchu-sieciowego-jako-podstawa-visibility-cybersecurity\">Monitoring sieci i network visibility \u2013 analiza ruchu sieciowego jako podstawa visibility cybersecurity<\/a> \u2014 JA3\/JA4 wymagaj\u0105 widoczno\u015bci ruchu i metadanych, kt\u00f3re zapewnia monitoring sieci.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/ioa-indicator-of-attack\">IoA (Indicator of Attack)<\/a> \u2014 JA3\/JA4 to wska\u017aniki zachowania, kt\u00f3re mog\u0105 wspiera\u0107 identyfikacj\u0119 ataku w ramach IoA.<\/li>\n<li><a href=\"https:\/\/www.sycope.com\/pl\/post\/czym-jest-netflow-i-jak-wykorzystuje-sie-go-w-praktyce\">Czym jest NetFlow i jak ten protok\u00f3\u0142 jest wykorzystywany w praktyce?<\/a> \u2014 <a href=\"https:\/\/www.sycope.com\/pl\/post\/dictionary-item\/netflow\">NetFlow<\/a> dostarcza dane o przep\u0142ywach, a JA3\/JA4 dodaj\u0105 kontekst TLS do analizy tych po\u0142\u0105cze\u0144.<\/li>\n<\/ul>\n","protected":false},"featured_media":0,"template":"","class_list":["post-4783","dictionary-item","type-dictionary-item","status-publish","hentry"],"acf":{"tytul":"JA3 \/ JA4 Fingerprinting","ikona":"","krotki_opis":"Techniki tworzenia sta\u0142ych odcisk\u00f3w klienta i serwera TLS z jawnych p\u00f3l handshake (ClientHello\/ServerHello), kt\u00f3re pozwalaj\u0105 rozpozna\u0107 aplikacj\u0119 lub malware bez deszyfracji ruchu."},"_links":{"self":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item\/4783","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/dictionary-item"}],"about":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/types\/dictionary-item"}],"wp:attachment":[{"href":"https:\/\/www.sycope.com\/pl\/wp-json\/wp\/v2\/media?parent=4783"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}