Introduction à la sécurité
Romuald THION
Semestre printemps 2023-2024 UCBL
Évaluer la sécurité = évaluer un risque. Exemples.
Un risque, au sens de la méthode EBIOS, est le produit :
Les métriques CIA, ce qu’on va évaluer :
La confidentialité et l’intégrité sont des propriétés garanties en partie par la cryptographie.
Les mesures techniques, comme la cryptographie, constituent un moyen de traiter les risques en le réduisant. Garde au technosolutionnisme !
CWE™ is a community-developed list of software and hardware weakness types. It serves as a common language, a measuring stick for security tools, and as a baseline for weakness identification, mitigation, and prevention efforts.
CAPEC™ helps by providing a comprehensive dictionary of known patterns of attack employed by adversaries to exploit known weaknesses in cyber-enabled capabilities. It can be used by analysts, developers, testers, and educators to advance community understanding and enhance defences.
https://cve.mitre.org/ ou https://www.cve.org/
The mission of the CVE® Program is to identify, define, and catalog publicly disclosed cybersecurity vulnerabilities. There is one CVE Record for each vulnerability in the catalog.
Exemples de vulnérabilités associées :
Kerckhoffs’s principle [The system] should not require secrecy, and it should not be a problem if it falls into enemy hands.
e.g. Crypto++ 5.6.0 Benchmarks, 2009
> openssl speed rsa
sign verify sign/s verify/s
rsa 1024 bits 0.000099s 0.000006s 10136.7 160581.8
rsa 2048 bits 0.000665s 0.000020s 1504.1 49263.4
> openssl aes
The 'numbers' are in 1000s of bytes per second processed.
type 1024 bytes 8192 bytes 16384 bytes
aes-128-cbc 696482.13k 691938.10k 706554.54k
aes-192-cbc 589946.54k 590230.87k 590812.50k
aes-256-cbc 497920.70k 495173.19k 501377.80k
🚀 Ainsi, chiffrer avec aes-128-cbc
prend environ 4.3
cycles par byte (grâce à AES-NI)
(pour un message de 1kB)
Si on veut chiffrer 2^{128} messages
de 1kB avec aes-128-cbc
au rythme de 700.000 par seconde
\approx 2^{19}, il faudrait 2^{109} secondes ! 💤
🔖 Voir aussi https://www.keylength.com/.
Le but est de prouver qu’un crypto-système est sûr (par réduction) ou, à l’inverse, de démontrer qu’une attaque est réalisable en pratique.
\mathrm{SSadv}^\star[\mathcal{A}, \mathcal{E}] = |Pr[W] - 1/2| où Pr[W] = Pr[\hat{b}=b] est la probabilité de gagner le jeu.
Definition 2.2 (semantic security). A cipher \mathcal{E} is semantically secure if for all efficient adversaries \mathcal{A}, the value \mathrm{SSadv}^\star[\mathcal{A}, \mathcal{E}] = \epsilon is negligible.
On veut que la probabilité \epsilon soit astronomiquement faible.
\mathrm{SSadv}^\star[\mathcal{A}, \mathcal{E}] = 1, il n’y a pas sécurité si le chiffrement à clef publique n’est pas randomisé !
On a plusieurs problèmes :
Voir démonstration.
Optimal Asymmetric Encryption Padding est le mode recommandé (PKCS#1 v2.2). Attention aux failles des versions précédentes (PKCS#1 v1.5.) qui sont vulnérables !
Optimal Asymmetric Encryption - How to Encrypt with RSA
\mathcal{E}^{G,H}(m) = \mathcal{E}(m \oplus G(s) \mid \mid s \oplus H(m \oplus G(s)))
Théorème 4.1 (informel) sous les hypothèses que G: 2^{k_0} \to 2^{n} et H : 2^{n} \to 2^{k_0} sont des fonctions idéalement aléatoire, alors casser \mathcal{E}^{G,H} est aussi difficile que casser le chiffrement \mathcal{E} d’origine.
Un système de signature (G, S, V) est sûr si la probabilité \mathrm{SIGadv}[\mathcal{A}, \mathcal{S}] où de gagner le jeu avec V(pk , m, σ) = \mathsf{accept} et m \notin \{m_1, m_2, \ldots\} est négligeable.
On inverse naïvement les rôles des clefs privées et publiques dans RSA: on définit S(sk, m) = m^d et V(pk, m, \sigma) = \mathsf{accept} \text{ iff } \sigma^e = m.
On montre que \mathcal{A} peut forger une signature pour m de son choix :
Voir TP introduction à la sécurité.
Démonstration à l’Oracle de parité, pré-figurative de l’attaque de Bleichenbacher sur PKCS#1 v1.5.
Slogan Don’t roll your own crypto
Anyone can invent an encryption algorithm they themselves can’t break; it’s much harder to invent one that no one else can break. Bruce SCHNEIER
Objectif général des attaques précédentes :
D’autres vulnérabilités peuvent survenir dans l’implémentation :
https://github.com/advisories/GHSA-c7hr-j4mj-j2w6
Versions 4.2.1 and earlier of jsonwebtoken are affected by a verification bypass vulnerability. This is a result of weak validation of the JWT algorithm type, occurring when an attacker is allowed to arbitrarily specify the JWT algorithm.
Side-channel analysis is a class of cryptanalytic attacks that exploit the physical environment of a cryptosystem to recover some leakage about its secret
Masking against Side-Channel Attacks: A Formal Security Proof, Emmanuel Prouff and Matthieu Rivain, EUROCRYPT 2013.
Timing attack sur exponentiating by squaring (a.k.a. square-and-multiply ou binary exponentiation).
def fast_power(base, power, modulo):
result = 1
while power > 0:
if power % 2 != 0:
power = power - 1
result = result * base
power = power // 2
base = (base * base) % modulo
# assert result == pow(base, power, modulo)
return result
Le nombre de multiplications dépend du nombre de bits à 1 dans l’écriture binaire de l’exposant
Dans le cas du déchiffrement RSA, l’exposant est la clef secrète :
🔥 The devil is in the details : démonstration sur
fast_power
et compare
(TP).
Extrait de Algorithms, Key Size and Protocols Report (2018), H2020-ICT-2014, ECRYPT-CSA.
Mais ça peut être difficile à réaliser exemple en C.