
CodeQL डिटेक्टर CVE-2022-2869 के मूल कारण (CWE-191 अहस्ताक्षरित अंडरफ्लो) के लिए, जो नियंत्रण-प्रवाह/रेंज विश्लेषण का उपयोग करके विशिष्ट फ़ंक्शनों को हार्ड-कोड किए बिना कमजोर पैटर्न की पहचान करता है।
यह प्रोजेक्ट CVE-2022-2869 के पीछे की मूल कमजोरी के लिए एक सामान्य CodeQL डिटेक्टर लागू करता है: एक अहस्ताक्षरित घटाव जो अंडरफ्लो हो सकता है क्योंकि प्रोग्राम ने अंकगणित से पहले पर्याप्त निचली-सीमा/क्रम गार्ड स्थापित नहीं किया है।
डिटेक्टर जानबूझकर मूल कारण (CWE-191) की रिपोर्ट करता है, न कि tiffcrop.c, फ़ंक्शन नाम, या वेरिएबल नामों को हार्ड-कोड करता है। यह CodeQL के मानक Overflow लाइब्रेरी का उपयोग करता है, जिसका गार्ड तर्क नियंत्रण प्रवाह/रेंज विश्लेषण पर आधारित है। यह नियंत्रण-प्रवाह प्रभुत्व के विकल्प के रूप में स्रोत-कोड लाइन-नंबर क्रम का उपयोग नहीं करता है।
UnsignedUnderflow.ql — सबमिट करने के लिए प्राथमिक डिटेक्टर।report.md — भेद्यता और क्वेरी स्पष्टीकरण।test/mini_tiffcrop_like.c — CVE-जैसे असुरक्षित मामले और सुरक्षित नियंत्रण।test/mini_tiffcrop_variant.c — एक संरचनात्मक रूप से भिन्न भिन्नता और सुरक्षित नियंत्रण।test/EXPECTED_RESULTS.md — इच्छित सकारात्मक/नकारात्मक व्यवहार।original/ORIGINAL_VALIDATION.md — कमजोर LibTIFF पर क्या प्रदर्शित किया जाना चाहिए।इस निर्देशिका से:
codeql pack install
Linux/WSL पर उदाहरण:
codeql database create db-tests \
--language=cpp \
--command="gcc -std=c11 -O0 -g test/mini_tiffcrop_like.c -o /tmp/test1 && gcc -std=c11 -O0 -g test/mini_tiffcrop_variant.c -o /tmp/test2"
क्वेरी चलाएँ:
codeql query run UnsignedUnderflow.ql --database=db-tests
CodeQL क्वेरी स्थैतिक विश्लेषण है। ASan वैकल्पिक साक्ष्य है जो कस्टम भिन्नताओं के परिणाम को दर्शाता है।
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_like.c -o mini1
./mini1 # सुरक्षित
./mini1 unsafe-x2 # अपेक्षित मेमोरी त्रुटि
gcc -std=c11 -O0 -g -fsanitize=address test/mini_tiffcrop_variant.c -o mini2
./mini2 # सुरक्षित
./mini2 unsafe # अपेक्षित मेमोरी त्रुटि
कमजोर LibTIFF संशोधन (उदाहरण के लिए 4.3.0) से एक CodeQL डेटाबेस बनाएँ, फिर उस डेटाबेस के विरुद्ध बिल्कुल वही UnsignedUnderflow.ql क्वेरी चलाएँ। परिणाम को tools/tiffcrop.c में कैप्चर करें, विशेष रूप से computeInputPixelOffsets में।
डिटेक्टर को tiffcrop, computeInputPixelOffsets, x2, या crop_width का उल्लेख करने के लिए नहीं बदला जाना चाहिए; अन्यथा यह एक CVE उदाहरण के लिए अति-अनुकूलित हो जाएगा और असाइनमेंट की भिन्नता आवश्यकता में विफल हो जाएगा।