Π‘Ρ‚Π°Ρ‚ΡŒΠΈ

πŸ“‰ ΠšΡ€Π°Ρ… Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π° 15 августа 2010 Π³ΠΎΠ΄Π°: Π‘Π°Π³ Π½Π° 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΅Π΄Π²Π° Π½Π΅ ΡƒΠ½ΠΈΡ‡Ρ‚ΠΎΠΆΠΈΠ» ΠΊΡ€ΠΈΠΏΡ‚ΠΎΠ²Π°Π»ΡŽΡ‚Ρƒ

15 августа 2010 Π³ΠΎΠ΄Π° Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ ΠΏΠ΅Ρ€Π΅ΠΆΠΈΠ» ΠΎΠ΄Π½Ρƒ ΠΈΠ· самых опасных Π°Ρ‚Π°ΠΊ Π·Π° всю свою ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ. Π’ Π±Π»ΠΎΠΊΠ΅ β„–74638 нСизвСстный эксплуатировал ΠΊΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π² ΠΊΠΎΠ΄Π΅ Bitcoin Core ΠΈ создал ΠΈΠ· воздуха… 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC β€” Π² дСсятки тысяч Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ прСдусмотрСно Π»ΠΈΠΌΠΈΡ‚ΠΎΠΌ Π² 21 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ ΠΌΠΎΠ½Π΅Ρ‚.

Π­Ρ‚ΠΎ событиС стало ваТнСйшСй Π²Π΅Ρ…ΠΎΠΉ Π² ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠΈ Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ устроСн Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ ΠΈ Ρ‡Ρ‚ΠΎ ΠΈΠΌΠ΅Π½Π½ΠΎ обСспСчиваСт Π΅Π³ΠΎ ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΠΎΡΡ‚ΡŒ β€” Π½Π΅ ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊΠΎΠ΄, сколько люди, стоящиС Π·Π° Π½ΠΈΠΌ.

⚠️ Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΠ»ΠΎ?

Π‘Π»ΠΎΠΊ 74638

  • Π”Π°Ρ‚Π°: 15 августа 2010 Π³ΠΎΠ΄Π°
  • Π‘Π»ΠΎΠΊ: β„–74638
  • Π‘ΡƒΡ‚ΡŒ Π±Π°Π³Π°: Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ пСрСполнСния цСлочислСнной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ (integer overflow), ΠΎΠ΄ΠΈΠ½ ΠΈΠ· участников сСти смог ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π΄Π²Π΅ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ ΠΏΠΎ 92,2 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC каТдая β€” Π² суммС 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC.

ΠŸΠΎΡ‡Π΅ΠΌΡƒ Π±Π°Π³ сработал?

Bitcoin Core Π½Π° Ρ‚ΠΎΡ‚ ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π½Π΅ провСрял сумму Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ чисСл. Π’ C/C++ это ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Ссли сумма становится большС максимально допустимого значСния (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, 2^64), ΠΎΠ½Π° обнуляСтся ΠΈΠ»ΠΈ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ΠΈΡ‚ Π² ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅, позволяя ΠΎΠ±ΠΎΠΉΡ‚ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ валидности.

if (txout_total > MAX_MONEY) // эта ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π΅ сработала ΠΈΠ·-Π·Π° пСрСполнСния

Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ смог ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π»ΠΈΠΌΠΈΡ‚ ΠΌΠΎΠ½Π΅Ρ‚, встроСнный Π² ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ».

🚨 РСакция сообщСства ΠΈ исправлСниС

Π£ΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ Π±Ρ‹Π»Π° Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π° ΠΎΡ‡Π΅Π½ΡŒ быстро. Π£ΠΆΠ΅ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… часов послС обнаруТСния:

  1. Π‘Π°Ρ‚ΠΎΡˆΠΈ Накамото Π»ΠΈΡ‡Π½ΠΎ выпустил ΠΏΠ°Ρ‚Ρ‡ Bitcoin вСрсии 0.3.10, ΡƒΡΡ‚Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ.
  2. Π‘Ρ‹Π»Π° Π²Π½Π΅Π΄Ρ€Π΅Π½Π° строгая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° суммы Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ² Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΈ.
  3. Π‘Π»ΠΎΠΊ 74638 ΠΈ всС ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π½Π° Π΅Π³ΠΎ основС Π±Ρ‹Π»ΠΈ ΠΎΡ‚ΠΊΠ°Ρ‚Π°Π½Ρ‹.
  4. Π£Π·Π»Ρ‹ сСти обновились Π½Π° Π½ΠΎΠ²ΡƒΡŽ Π²Π΅Ρ€ΡΠΈΡŽ ΠΈ Π½Π°Ρ‡Π°Π»ΠΈ ΠΌΠ°ΠΉΠ½ΠΈΡ‚ΡŒ Π±Π»ΠΎΠΊΠΈ Π½Π° «Ρ‡ΠΈΡΡ‚ΠΎΠΉ» Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅.
  5. Π§Π΅Ρ€Π΅Π· 5 часов зловрСдная Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° Π±Ρ‹Π»Π° вытСснСна ΠΈΠ· консСнсуса.

Π­Ρ‚ΠΎ Π±Ρ‹Π» Ρ…Π°Ρ€Π΄Ρ„ΠΎΡ€ΠΊ, Π½ΠΎ Π½Π΅ Π·Π°ΠΏΠ»Π°Π½ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ, Π° экстрСнный β€” ΠΈ всС ΠΆΠ΅ ΠΎΠ½ ΠΏΡ€ΠΎΡˆΡ‘Π» быстро ΠΈ эффСктивно благодаря скоординированным дСйствиям сообщСства.

🧠 Π§Ρ‚ΠΎ это Π·Π½Π°Ρ‡ΠΈΡ‚ для Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π°?

πŸ“Œ ΠœΠΈΡ„: Β«Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ β€” это Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΊ ΠΊΠΎΠ΄ΡƒΒ»

МногиС сСгодня ΠΏΠΎΠ²Ρ‚ΠΎΡ€ΡΡŽΡ‚ ΠΌΠ°Π½Ρ‚Ρ€Ρƒ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½, устойчив, ΠΈ всё Ρ€Π΅ΡˆΠ°Π΅Ρ‚ΡΡ ΠΊΠΎΠ΄ΠΎΠΌ. Но Π² августС 2010 Π³ΠΎΠ΄Π° ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΊΠΎΠ΄ Π΄Π°Π» сбой β€” ΠΈ спасла ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π½Π΅ магия Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌΠΎΠ², Π° люди:

  • ΠšΡ‚ΠΎ-Ρ‚ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» аномалию.
  • ΠšΡ‚ΠΎ-Ρ‚ΠΎ понял, Π² Ρ‡Π΅ΠΌ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°.
  • ΠšΡ‚ΠΎ-Ρ‚ΠΎ написал ΠΈ ΠΎΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Π» исправлСниС.
  • ΠšΡ‚ΠΎ-Ρ‚ΠΎ ΡƒΠ±Π΅Π΄ΠΈΠ» ΠΌΠ°ΠΉΠ½Π΅Ρ€ΠΎΠ² ΠΈ участников сСти ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚ΡŒΡΡ.

Π­Ρ‚ΠΎ событиС ΠΏΠΎΠΊΠ°Π·Π°Π»ΠΎ: Π² основС Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π° Π»Π΅ΠΆΠΈΡ‚ ΡΠΎΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ консСнсус, Π° Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ.

πŸ” Как измСнилась Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π° послС ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°?

ПослС ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π°:

  • Π‘Ρ‹Π»Π° Π²Π½Π΅Π΄Ρ€Π΅Π½Π° Тёсткая ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠ΅ Π»ΠΈΠΌΠΈΡ‚Π° ΠΌΠΎΠ½Π΅Ρ‚.
  • Π’Π²Π΅Π΄Π΅Π½Ρ‹ Π±ΠΎΠ»Π΅Π΅ строгиС условия Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ Ρ‚Ρ€Π°Π½Π·Π°ΠΊΡ†ΠΈΠΉ.
  • УсилСно тСстированиС Π½ΠΎΠ²Ρ‹Ρ… Ρ€Π΅Π»ΠΈΠ·ΠΎΠ².
  • БообщСство стало большС ΠΎΡΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ Π²Π°ΠΆΠ½ΠΎΡΡ‚ΡŒ наблюдСния ΠΈ отвСтствСнности.

πŸ“š Π”Π΅Π»Π°Π΅ΠΌ РСзюмС

Π‘Π°Π³ Π½Π° 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC β€” это Π½Π΅ просто ошибка, это лакмусовая Π±ΡƒΠΌΠ°ΠΆΠΊΠ° Π΄Π΅Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… систСм. Он ΠΏΠΎΠΊΠ°Π·Π°Π», Ρ‡Ρ‚ΠΎ:

  • Код ΠΌΠΎΠΆΠ΅Ρ‚ Π΄Π°Ρ‚ΡŒ сбой.
  • Π›ΡŽΠ΄ΠΈ, ΠΏΠΎΠ½ΠΈΠΌΠ°ΡŽΡ‰ΠΈΠ΅, ΠΊΠ°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ систСма, β€” Π΅Ρ‘ настоящиС Ρ…Ρ€Π°Π½ΠΈΡ‚Π΅Π»ΠΈ.
  • Π”ΠΎΠ²Π΅Ρ€ΠΈΠ΅ Π² Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π΅ β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎ матСматичСскиС Π΄ΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒΡΡ‚Π²Π°, Π½ΠΎ ΠΈ ΠΏΡ€ΠΎ Π·Ρ€Π΅Π»ΠΎΡΡ‚ΡŒ ΠΈ ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ сообщСства.

Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ Π²Ρ‹ΠΆΠΈΠ» Π½Π΅ ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π±Π΅Π·ΡƒΠΏΡ€Π΅Ρ‡Π΅Π½. А ΠΏΠΎΡ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ сообщСство Π±Ρ‹Π»ΠΎ Π³ΠΎΡ‚ΠΎΠ²ΠΎ Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π΅Π³ΠΎ.

Если Ρ…ΠΎΡ‡Π΅ΡˆΡŒ, ΠΌΠΎΠ³Ρƒ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π² ΡΡ‚Π°Ρ‚ΡŒΡŽ тСхничСскиС Π΄Π΅Ρ‚Π°Π»ΠΈ ΠΊΠΎΠ΄Π°, ссылки Π½Π° Π°Ρ€Ρ…ΠΈΠ² Ρ„ΠΎΡ€ΡƒΠΌΠ° Bitcointalk ΠΏΠΎ этой Ρ‚Π΅ΠΌΠ΅ ΠΈΠ»ΠΈ ΠΈΠ½Ρ„ΠΎΠ³Ρ€Π°Ρ„ΠΈΠΊΡƒ.

Π₯Π²Π°Π»Π° Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊΡƒ

Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΌΠΎΠ³ Π±Ρ‹ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ ΠΈ ΠΌΠ΅Π½ΡŒΡˆΡƒΡŽ сумму, Π½ΠΎ, скорСС всСго, ΠΎΠ½ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ Π²Ρ‹Π±Ρ€Π°Π» ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ Ρ†ΠΈΡ„Ρ€Ρƒ β€” 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC, Ρ‡Ρ‚ΠΎΠ±Ρ‹:

βœ… 1. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΈΡ‚ΡŒ Π³Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈ ΡΠΏΡ€ΠΎΠ²ΠΎΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅

  • Π’ языкС программирования C++, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ написан Bitcoin Core, ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ цСлочислСнных Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ (integer overflow) происходит ΠΏΡ€ΠΈ ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½ΠΈΠΈ максимального значСния Ρ‚ΠΈΠΏΠ° Π΄Π°Π½Π½Ρ‹Ρ….
  • Π’ΠΈΠΏ int64_t (signed 64-bit integer), ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ для хранСния суммы ΡΠ°Ρ‚ΠΎΡˆΠΈ (1 BTC = 100,000,000 ΡΠ°Ρ‚ΠΎΡˆΠΈ), ΠΈΠΌΠ΅Π΅Ρ‚ Π»ΠΈΠΌΠΈΡ‚ ΠΎΠΊΠΎΠ»ΠΎ Β±9.22 Γ— 10^18.
  • ЗначСния, Π±Π»ΠΈΠ·ΠΊΠΈΠ΅ ΠΊ этому ΠΏΡ€Π΅Π΄Π΅Π»Ρƒ, ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΌΠΎΠ³ΡƒΡ‚ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ нСпрСдсказуСмоС ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ β€” Π²Ρ€ΠΎΠ΄Π΅ обнулСния, ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΈΠ»ΠΈ «оборачивания» числа.

β†’ Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ, скорСС всСго, ΡΠΎΠ·Π½Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ протСстировал ΠΊΡ€Π°ΠΉΠ½ΠΈΠ΅ значСния, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡΠΏΡ€ΠΎΠ²ΠΎΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°Π³.

βœ… 2. Π£Π±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π°Ρ‚Π°ΠΊΠ° ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Π°

  • Если Π±Ρ‹ ΠΎΠ½ создал, скаТСм, 1000 BTC, это выглядСло Π±Ρ‹ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎ, ΠΈ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» Π±Ρ‹ сразу.
  • 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC β€” это Π½Π°ΡΡ‚ΠΎΠ»ΡŒΠΊΠΎ аномально, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π»Π΅ΠΊΠ»ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½ΠΎΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ сообщСства.

Π­Ρ‚ΠΎ Π±Ρ‹Π» способ ΡΠΈΠ³Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠ± уязвимости Π³Ρ€ΠΎΠΌΠΊΠΎ, ΠΏΠΎΡ‡Ρ‚ΠΈ ΠΊΠ°ΠΊ Β«white-hatΒ» (этичСский Ρ…Π°ΠΊΠ΅Ρ€), Π½ΠΎ Π±Π΅Π· объяснСний.

βœ… 3. Π˜Π³Ρ€Π° Π½Π° эффСктС: ΠΏΡ€ΠΎΠ΄Π΅ΠΌΠΎΠ½ΡΡ‚Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΠ·Π²ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»Π°

  • Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ†Π΅Π»ΡŒΡŽ Π±Ρ‹Π»ΠΎ Π½Π΅ ΠΎΠ±ΠΎΠ³Π°Ρ‚ΠΈΡ‚ΡŒΡΡ, Π° ΠΏΠΎΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΌΠΈΡ€Ρƒ, Ρ‡Ρ‚ΠΎ Π² Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π΅ всё Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ критичСскиС Π΄Ρ‹Ρ€Ρ‹.
  • Π’ 2010 Π³ΠΎΠ΄Ρƒ Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π°Π±ΠΈΡ€Π°Π» ΠΎΠ±ΠΎΡ€ΠΎΡ‚Ρ‹, ΠΈ Ρ‚Π°ΠΊΠΈΠ΅ Π°Ρ‚Π°ΠΊΠΈ ΠΌΠΎΠ³Π»ΠΈ Ρ€Π°Π·Ρ€ΡƒΡˆΠΈΡ‚ΡŒ Π΄ΠΎΠ²Π΅Ρ€ΠΈΠ΅ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ.

πŸ’‘ Π˜Π½Ρ‚Π΅Ρ€Π΅ΡΠ½Ρ‹ΠΉ Ρ„Π°ΠΊΡ‚

Никто Π½Π΅ ΠΏΠΎΡ‚Ρ€Π°Ρ‚ΠΈΠ» эти 184 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC. Они Π±Ρ‹Π»ΠΈ быстро Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Ρ‹, Π° Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ° с Π±Π°Π³ΠΎΠΌ ΠΎΡ‚ΠΊΠ»ΠΎΠ½Π΅Π½Π°. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Π½ΠΈΠΊΠ°ΠΊΠΎΠΉ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΉ финансовой Π²Ρ‹Π³ΠΎΠ΄Ρ‹ Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π½Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ».

πŸ”Ž Π’Ρ‹Π²ΠΎΠ΄

Π—Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ Π²Ρ‹Π±Ρ€Π°Π» ΠΎΠ³Ρ€ΠΎΠΌΠ½ΡƒΡŽ сумму Π½Π΅ случайно. Π­Ρ‚ΠΎ Π±Ρ‹Π»Π° дСмонстрация уязвимости Ρ‡Π΅Ρ€Π΅Π· Ρ€Π΅Π·ΠΎΠ½Π°Π½ΡΠ½ΡƒΡŽ ΠΈ ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½ΡƒΡŽ аномалию. МалСнькая сумма ΠΎΡΡ‚Π°Π»Π°ΡΡŒ Π±Ρ‹ Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½ΠΎΠΉ, Π° огромная β€” ΠΌΠ³Π½ΠΎΠ²Π΅Π½Π½ΠΎ спровоцировала Ρ€Π΅Π°ΠΊΡ†ΠΈΡŽ.

Π₯ΠΎΡ‡Π΅ΡˆΡŒ, ΠΌΠΎΠ³Ρƒ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π±Π»ΠΎΠΊ с тСхничСским ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΊΠΎΠ΄Π° пСрСполнСния ΠΈΠ»ΠΈ Π΄ΠΈΠ°Π³Ρ€Π°ΠΌΠΌΡƒ, ΠΊΠ°ΠΊ это выглядСло Π² Π±Π»ΠΎΠΊΠ΅.

Π’ΠΎΡ‚ тСхничСский ΠΏΡ€ΠΈΠΌΠ΅Ρ€ Π½Π° C++, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈΠ»Π»ΡŽΡΡ‚Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΡΡƒΡ‚ΡŒ Π±Π°Π³Π° с ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ, Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎΠ³ΠΎ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΡˆΡ‘Π» 15 августа 2010 Π³ΠΎΠ΄Π° Π² Π‘ΠΈΡ‚ΠΊΠΎΠΈΠ½Π΅.

πŸ’» ΠŸΡ€ΠΈΠΌΠ΅Ρ€: ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ int64_t ΠΏΡ€ΠΈ вычислСнии суммы Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ²

πŸ”Ή Π˜ΡΡ…ΠΎΠ΄Π½Ρ‹Π΅ условия:

  • Π‘Π°Ρ‚ΠΎΡˆΠΈ Π² ΠΊΠΎΠ΄Π΅ хранятся ΠΊΠ°ΠΊ 64-Π±ΠΈΡ‚Π½ΠΎΠ΅ Ρ†Π΅Π»ΠΎΠ΅ число int64_t.
  • Π›ΠΈΠΌΠΈΡ‚: 21 ΠΌΠ»Π½ BTC = 2.1 * 10^15 ΡΠ°Ρ‚ΠΎΡˆΠΈ.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΎΠ»ΠΆΠ½Π° Π±Ρ‹Ρ‚ΡŒ: сумма Π²Ρ‹Ρ…ΠΎΠ΄ΠΎΠ² ≀ 21 ΠΌΠ»Π½ BTC (Π² ΡΠ°Ρ‚ΠΎΡˆΠΈ).

πŸ”Ή Код с ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΌ Π±Π°Π³ΠΎΠΌ:


#include
#include int main() {
// КаТдоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” 92.2 ΠΌΠΈΠ»Π»ΠΈΠ°Ρ€Π΄Π° BTC Π² ΡΠ°Ρ‚ΠΎΡˆΠΈ
int64_t txout1 = 9223372036854775807; // МаксимальноС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ int64_t
int64_t txout2 = 100; // Π›ΡŽΠ±Π°Ρ малая суммаint64_t total = txout1 + txout2; // Ρ‚ΡƒΡ‚ происходит ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅std::cout << "txout1: " << txout1 << std::endl;
std::cout << "txout2: " << txout2 << std::endl;
std::cout << "total: " << total << std::endl; // даст ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число!// ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° валидности β€” Π½Π΅ сработаСт
if (total < 21000000LL * 100000000LL) {
std::cout << "Π‘ΡƒΠΌΠΌΠ° допустима" << std::endl;
} else {
std::cout << "Π‘ΡƒΠΌΠΌΠ° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ°Π΅Ρ‚ Π»ΠΈΠΌΠΈΡ‚!" << std::endl;
}

return 0;
}

πŸ“‰ Π§Ρ‚ΠΎ ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚?

  • txout1 β€” это максимальноС допустимоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ для int64_t: 9223372036854775807
  • ΠŸΡ€ΠΈ слоТСнии с Π»ΡŽΠ±Ρ‹ΠΌ числом ΠΏΡ€ΠΎΠΈΠ·ΠΎΠΉΠ΄Ρ‘Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ β†’ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ станСт ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΈΠ»ΠΈ «ΠΎΠ±Π½ΡƒΠ»ΠΈΡ‚ся» Π² ΠΏΡ€Π΅Π΄Π΅Π»Π°Ρ… Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½Π°.
  • ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° if (total < MAX_MONEY) Π½Π΅ сработаСт, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ total β€” ΡƒΠΆΠ΅ ΠΎΡ‚Ρ€ΠΈΡ†Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ число, ΠΈ ΠΎΠ½ΠΎ «ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚» ΠΏΠΎΠ΄ Π»ΠΈΠΌΠΈΡ‚ΠΎΠΌ.

πŸ›  Как это устранили Π² Bitcoin Core

ПослС ΠΈΠ½Ρ†ΠΈΠ΄Π΅Π½Ρ‚Π° Π±Ρ‹Π» Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ явно провСряСт ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ:
if (!MoneyRange(txout.nValue))
return state.DoS(100, false, REJECT_INVALID, "txout.nValue out of range");CAmount nValueOut = 0;
for (const auto& txout : tx.vout) {
nValueOut += txout.nValue;
if (!MoneyRange(nValueOut))
return state.DoS(100, false, REJECT_INVALID, "txout total out of range");
}

Ѐункция MoneyRange() Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ значСния Π½Π΅ выходят Π·Π° допустимый Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½.

ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ

Кнопка «НавСрх»