Maintenance et dépendance logicielle

Authentification serveur et client
Romuald THION
Semestre printemps 2023-2024 UCBL
L’authentification désigne le processus visant à vérifier qu’une entité (personne, service, machine) est bien légitime pour accéder au système.
Différences entre
Les facteurs de validation pour l’authentification
👉 Pour le dernier, on parle plutôt d’identification, car il n’y a pas de secret.
Référence (practical cryptography).
Référence (practical cryptography).
Voir 8.11 Security without collision resistance (Boneh, Shoup, 2023).
Dit à clef secrète ou partagée. Référence (practical cryptography).
Dit à clef publique. Référence (practical cryptography).
Référence (practical cryptography).
Référence (practical cryptography).
💡 MAC et signature visent l’authentification (au sens cryptographique) dans le cadre symétrique ou asymétrique. 💡
\mathsf{HMAC}_k(m) = h(\bar{k} \oplus \mathsf{opad} \| h(\bar{k} \oplus \mathsf{ipad} \| m))
0x36
et 0x5c
répétésRemarque : les briques de bases sont
interdépendantes, par exemple le mode AES-CTR est une forme de
chiffrement par flux qui lui-même est assimilable à un CSPRNG, voir par
exemple /dev/urandom
du kernel Linux.
A Research Agenda Acknowledging the Persistence of Passwords
Despite countless attempts and near-universal desire to replace passwords, they’re more widely used than ever. The authors assert that, in many instances, passwords are the best-fit solution […].
Among security experts, there is near-unanimous agreement on the desirability of replacing passwords. Yet, this meta-goal is accepted without an understanding of what exactly is required of a replacement or what will improve once they are replaced.
Avec h une fonction de hachage, le protocole usuel de vérification :
Le vérificateur stocke les paires \langle A_i, h(pw_i) \rangle dans la table des mots de passe \mathrm{pt}
maintainer:OYnL8rCBbf7rc
edgar:C8Z6wDFKm5bV6
patrick:58kk0mpCjpL9o
edwin:.8cBf8RFZqfvI
frank:gvEFH2KSvYZS2
jaap:NMS4yrkEfQz9c
On ne stocke pas les mots de passes en clair, mais on reste exposé à une attaque hors ligne si on connaît \mathrm{pt}.
☢️ Dans ce protocole les mots de passe circulent en clair, il est donc nécessaire d’avoir un canal de communication sécurisé entre les partenaires, typiquement TLS/HTTPS. ☢️
🤔 Passer A_i \to B: \langle A_i, h(pw_i) \rangle ne change pas la sécurité, car on peut rejouer le haché.
On a un compromis temps/mémoire en calculant les hachés à l’avance.
La méthode des rainbow tables est un très beau compromis entre calculer tous les hash à l’avance et tout calculer à la volée, voir Making a Faster Cryptanalytic Time-Memory Trade-Off
Pour un alphabet \Sigma, il y a |\Sigma| ^ n mots de passe de longueurs n. On peut parcourir intelligemment \Sigma ^ n
OpenCL API (OpenCL 3.0 CUDA 12.1.109) [...]
========================================================================
* Device #1: NVIDIA GeForce GTX 1650, 3520/4095 MB (1023 MB allocatable), 14MCU
* (MD5) 11823.4 MH/s [...]
* (SHA1) 3724.8 MH/s [...]
* (SHA2-256) 1587.3 MH/s [...]
* (SHA2-512) 462.9 MH/s [...]
* (NTLM) 20751.5 MH/s [...]
* (NetNTLMv1 / NetNTLMv1+ESS) 10998.3 MH/s [...]
* (bcrypt $2*$, Blowfish (Unix)) [I : 32] 7333 H/s [...]
Combien de temps pour explorer tous les mots de passe de longueur n avec 62 caractères autorisés ?
def pretty(n):
nb = (2**6) ** n
return f"{n:2}", f"{nb / 11.8E9:.2e} sec", f"{nb:,} pwd"
[print(*pretty(n)) for n in range(4, 17)]
4 1.42e-03 sec 16,777,216 pwd
5 9.10e-02 sec 1,073,741,824 pwd
6 5.82e+00 sec 68,719,476,736 pwd
7 3.73e+02 sec 4,398,046,511,104 pwd
8 2.39e+04 sec 281,474,976,710,656 pwd
9 1.53e+06 sec 18,014,398,509,481,984 pwd
10 9.77e+07 sec 1,152,921,504,606,846,976 pwd
11 6.25e+09 sec 73,786,976,294,838,206,464 pwd
12 4.00e+11 sec 4,722,366,482,869,645,213,696 pwd
13 2.56e+13 sec 302,231,454,903,657,293,676,544 pwd
14 1.64e+15 sec 19,342,813,113,834,066,795,298,816 pwd
15 1.05e+17 sec 1,237,940,039,285,380,274,899,124,224 pwd
16 6.71e+18 sec 79,228,162,514,264,337,593,543,950,336 pwd
Table de nombre de hachés par seconde fonction de |\Sigma| et n sur un cluster selon la fonction.
Ever wondered what a #hashstack @hashcat cluster of 448x RTX 2080s could do for #password #cracking? How about 31.8 TH/s on NTLM, 17.7 TH/s on MD5
On essaie et on attend la réponse du vérificateur :
Pour l’utilisabilité, il faut une procédure de récupération ou de changement de mot de passe, mais attention à sa sécurité, car la surface d’attaque est augmentée. Voir CAPEC-50: Password Recovery Exploitation.
On dispose de \mathrm{pt}, on cherche pw t.q. pt=h(pw).
💡 Les fonctions sûres pour dériver des mots de passes sont appelées Key Derivation Function – KDF. Par exemple, pour élargir un secret à la taille d’un bloc (e.g., 32 octets) dans le chiffrement symétrique.
On ajoute une donnée aléatoire non confidentielle au mot de passe, le sel.
Dans une table des mots de passes salés, le vérificateur stocke les paires \langle A_i, s_i, h(pw_i,s_i) \rangle :
maintainer:ef$OYnL8rCBbf7rc
edgar:01$C8Z6wDFKm5bV6
patrick:45$58kk0mpCjpL9o
edwin:a5$.8cBf8RFZqfvI
Principe général de CHAP, CRAM ou SCRAM : rendre le processus d’authentification dynamique.
Exemple méthode SCRAM(RFC5802) :
scram-sha-256
dans PostgreSQLQue stocker côté serveur ?
Extrait de la motivation dans MongoDB :
These attacks provide justification for SCRAM’s design, as it is specifically intended to counter them.
- Eavesdropping […]
- Replay […]
- Database Compromise […]
- Malicious Server […]
Les hachés sont stockés dans /etc/shadow
, avec
différentes méthodes :
Exemples, voir unix.stackexchange.com
> mkpasswd -m sha-512 --salt abcdefgh
$6$u2bvcyi0$76I3KxGizdl/PENw[...]4FUhEBcKcg.
> openssl passwd -6 -salt abcdefgh
$6$u2bvcyi0$76I3KxGizdl/PENw[...]4FUhEBcKcg.
On ne parle pas ici d’HTTPS mais des moyens inclus
dans HTTP (Basic
, Digest
,
Bearer
, etc.) pour l’authentification.
Voir HTTP authentication et WWW-Authenticate sur MDN.
RFC 7617 - The ‘Basic’ HTTP Authentication Scheme
base64(login:password)
.Authorization: Basic
.RFC 7616 - HTTP Digest Access Authentication
WWW-Authenticate
H=(HA1, nonce, nc, cnonce, qop, HA2)
avec
HA1=H(user:realm:password)
HA2=H(method:uri_path)
Authorization: Digest
Voir OWASP Authentication cheat sheet
OWASP : password storage cheat sheet, voir la section Password Hashing Algorithms
Argon2 is a password-hashing function that summarizes the state of the art in the design of memory-hard functions and can be used to hash passwords for credential storage, key derivation, or other applications.
Argon2 le gagnant du concours PHC est nativement salé 🧂, coûteux en temps 🐢 et en mémoire 🐘.
👉 Voir par exemple le wrapper JavaScript ou celui Python.
⚠️ Utiliser un gestionnaire de mots de passe comme https://keepass.info/ ou https://keepassxc.org/. ⚠️
Extrait du rapport d’audit de Zaur Molotnikov.
KeePassXC provides sufficient cryptographic protection (confidentiality, integrity and authenticity) to the confidential information the user is storing in the database, given that the user selects a strong authentication method.
🚨 Problème majeur des systèmes à clefs publiques : l’authentification. 🚨
On peut transmettre les clefs publiques sur un canal non sûr pour ensuite établir un canal sécurisé (en choisissant une clef secrète commune aux parties), mais comment assurer effectivement qu’il s’agit du bon interlocuteur ? 🤔
🔏 Les certificats (X509) capturent les relations de la forme A dit que K est bien la clef publique de B. Un certificat contient :
🤔 Comment avoir confiance dans le certificateur ?
🤯 Et à la racine, à quelles autorités fait-on confiance, implicitement ?! 🤯
👉 Voir Mozilla Included CA Certificate List qui fait de remarquables efforts de transparence à ce sujet.
Data:
Version: 3 (0x2)
Serial Number:
11:75:4f:19:da:09:eb:08:00:40:77:e9:6d:20:60:4f:39:73:60:1c
Signature Algorithm: ecdsa-with-SHA256
Issuer: C = FR, ST = Some-State, O = UCBL, CN = TIW4
Validity
Not Before: Sep 12 12:10:30 2020 GMT
Not After : Sep 12 12:10:30 2021 GMT
Subject: C = FR, ST = Some-State, O = UCBL, CN = TIW4
Subject Public Key Info:
Public Key Algorithm: id-ecPublicKey
...
🗒️ Généralement de longue durée, avec des clefs de grandes tailles.
💡 La gestion des clefs est un problème difficile et technique, voir par exemple https://pki-tutorial.readthedocs.io/en/latest/ pour la mise en place de PKI – Public Key Infrastructures avec OpenSSL.
🧑⚖️ Le problème de la révocation en particulier, via les Certificate Revocation List – CRL ou mieux, via Online Certificate Status Protocol – OCSP.
Plus récemment, l’exemple de l’attaque sur xz
:
🔖 Timeline of the xz open source attack et Everything I know about the XZ backdoor.