feat(pr2): HTTP/2+HTTP/3 fingerprint extractors — JA4H, H2 SETTINGS, JA4-QUIC
This commit is contained in:
@@ -180,6 +180,15 @@ class AttackerIdentity(SQLModel, table=True):
|
||||
hassh_hashes: Optional[str] = Field(
|
||||
default=None, sa_column=Column("hassh_hashes", Text, nullable=True)
|
||||
)
|
||||
ja4h_hashes: Optional[str] = Field(
|
||||
default=None, sa_column=Column("ja4h_hashes", Text, nullable=True)
|
||||
)
|
||||
ja4_quic_hashes: Optional[str] = Field(
|
||||
default=None, sa_column=Column("ja4_quic_hashes", Text, nullable=True)
|
||||
)
|
||||
http_versions_seen: Optional[str] = Field(
|
||||
default=None, sa_column=Column("http_versions_seen", Text, nullable=True)
|
||||
)
|
||||
# JSON list[str] — SHA-256 fingerprints of leaf certs presented by
|
||||
# attacker-run TLS servers, captured by the active prober alongside
|
||||
# JARM. Same federation-gossip rationale as ja3_hashes/hassh_hashes:
|
||||
|
||||
@@ -89,6 +89,15 @@ class CanaryFingerprintEvidence(TypedDict):
|
||||
matched_signature: str # signature ID, not raw fingerprint blob
|
||||
|
||||
|
||||
class HttpFingerprintEvidence(TypedDict):
|
||||
kind: str # "ja4h" | "h2_settings" | "h3_settings" | "ja4_quic"
|
||||
hash: str # fingerprint hash string (or empty for settings events)
|
||||
protocol: str # "h1" | "h2" | "h2c" | "h3"
|
||||
client_ip: str
|
||||
seen_at: str # ISO8601 UTC
|
||||
raw: Optional[dict] # raw settings dict for h2_settings / h3_settings
|
||||
|
||||
|
||||
# ── Tables ──────────────────────────────────────────────────────────
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user