Certificate pinning
Pinning — приложение (или браузер) хранит у себя отпечаток или публичный ключ конкретного серта/CA, и принимает только его. Никакие другие валидные CA не помогут атакующему подделать соединение.
Стандартная модель TLS доверяет ~100 корневым CA. Компрометация любого из них = MITM на любой сайт. Pinning ограничивает: «даже если Comodo выпустит валидный серт на google.com — приложение его отвергнет, ему нужен именно Google-cert».
Виды pinning
| Что закреплено | Особенности |
|---|---|
| Cert pinning | Отпечаток самого серта. Легко сломать при ротации. |
| SPKI pinning | Subject Public Key Info. Можно перевыпустить cert с тем же ключом — pinning продолжит работать. |
| CA pinning | Отпечаток промежуточного или корневого CA. Более гибко, менее строго. |
Практика: pin-ят SPKI + запасной SPKI (backup), чтобы при компрометации основного ключа переключиться на резервный без обновления приложения.
HPKP (умер)
HTTP Public Key Pinning (RFC 7469) — заголовок для веба:
Public-Key-Pins: pin-sha256="base64=="; pin-sha256="backup=="; max-age=5184000
Chrome удалил поддержку в 2018, Firefox в 2020. Причины:
- Ransom-pinning — атакующий получал контроль над сайтом на 5 минут, ставил Pin с чужим ключом на год. Сайт больше не доступен.
- Сложно правильно настроить, легко self-DoS.
- CT-логи дают лучшую защиту с меньшим риском.
Pinning в мобильных приложениях
Живёт и здравствует. Банковские, платёжные, мессенджеры-приложения зашивают pin ключей своих серверов прямо в бинарник.
Android
// Network Security Config
<domain-config>
<domain>api.mybank.com</domain>
<pin-set>
<pin digest="SHA-256">AAAAAAAAAAAAA=</pin>
<pin digest="SHA-256">BBBBBBBBBBBBB=</pin>
</pin-set>
</domain-config>
iOS
Через URLSession delegate urlSession:didReceiveChallenge: — вручную сравнить с локальным списком.
Библиотеки
- OkHttp CertificatePinner (Android).
- TrustKit (iOS + Android).
Обход pinning
Стандартный кейс для security-research/pentester-ов:
- Frida с скриптами вроде
frida-multiple-unpinning— хукает функции проверки pin и заставляет их вернуть true. - Objection — обёртка вокруг Frida с готовыми командами.
- Xposed модули (SSLUnpinning) — для Android.
- Ручной патч бинарника — если pin захардкожен в коде.
Всё это требует root/jailbreak или debuggable-версии приложения. Обычному пользователю не нужно, но с точки зрения защиты — pinning не непробиваем, это удобство и «второй эшелон» защиты.