Foundationপ্রথম নীতি থেকে
LEVEL 10 · Computer Security

Signed/Unsigned Confusion

সাইনড/আনসাইনড কনফিউশন

একটা signed length-check ঋণাত্মক মান আটকাতে ব্যর্থ হয়, আর সেই একই bit-pattern পরে memcpy-জাতীয় ফাংশনের unsigned size_t প্যারামিটারে পৌঁছে একটা বিশাল ধনাত্মক সংখ্যায় পুনর্ব্যাখ্যাত হয়।

also: sign-confusion, unsigned-wraparound-bypass

requested_len = -1  (signed int)
check: requested_len > max_len  ->  false  (signed domain-এ -1 সবসময় ছোট)

memcpy(dst, src, requested_len)   ← তৃতীয় প্যারামিটার size_t (unsigned)
একই bit-pattern, unsigned হিসেবে পড়া হলে: 0xFFFFFFFF = 4,294,967,295
  • CWE-191 (Integer Underflow)-এর ঘনিষ্ঠ আত্মীয় — কোনো বিট হারায় না, শুধু একই bit-pattern দুই ভিন্ন টাইপ-নিয়মে দুইবার পড়া হয়
  • ফিক্স কোনো নতুন গণিত না — শুধু negative-এর জন্য একটা আলাদা, upper-bound-check-এর ওপর নির্ভর না করা explicit চেক
  • 64-bit সিস্টেমেও ঝুঁকি থাকে: একই -1, 64-bit size_t-এ প্রায় ১৮.৪ কুইন্টিলিয়ন byte-এ পুনর্ব্যাখ্যাত হয়