
CVE-2018-20343 के लिए प्रमाण अवधारणा
यह CVE-2018-20343 के लिए एक PoC है, जो केन सिल्वरमैन के Build Engine में एक कमजोरी है। उत्पन्न .map फ़ाइल बफर ओवरफ्लो को ट्रिगर करती है और स्टैक को ओवरराइट करती है जैसा कि नीचे दिखाया गया है:
Open Watcom डॉसबॉक्स 0.74-2 के तहत: विश्लेषक स्टैक को नियंत्रित करता है
FreeDos 1.2 के तहत: विश्लेषक EIP को नियंत्रित करता है
कमजोर कोड ENGINE.C में है:
1935 kread(fil,&numsectors,2);
1936 kread(fil,§or[0],sizeof(sectortype)*numsectors);
चर sector का घोषित आकार MAXSECTORS * sizeof(struct sectortype) = 1024 * 40 = 40960 बाइट्स है। विश्लेषक numsectors को नियंत्रित करता है (क्योंकि यह मैप फ़ाइल से पढ़ा जाता है) और इस प्रकार एक मैप फ़ाइल बना सकता है जिसमें numsectors को 40960 से अधिक मान के साथ प्रारंभ किया जाता है ताकि ओवरफ्लो ट्रिगर हो।
केन सिल्वरमैन ने बताया कि kread फ़ंक्शन पर निर्भर कोड, जैसे निम्नलिखित कोड स्निपेट, भी कमजोर हो सकते हैं:
ENGINE.C में:
1938 kread(fil,&numwalls,2);
1939 kread(fil,&wall[0],sizeof(walltype)*numwalls);
1940
1941 kread(fil,&numsprites,2);
1942 kread(fil,&sprite[0],sizeof(spritetype)*numsprites);
2033 kread(fil,palette,768);
2034 kread(fil,&numpalookups,2);
[...]
2046 kread(fil,palookup[globalpal],numpalookups<<8);
2047 kread(fil,transluc,65536);
2453 kread(fil,&artversion,4);
2454 if (artversion != 1) return(-1);
2455 kread(fil,&numtiles,4);
2456 kread(fil,&localtilestart,4);
2457 kread(fil,&localtileend,4);
2458 kread(fil,&tilesizx[localtilestart],(localtileend-localtilestart+1)<<1);
2459 kread(fil,&tilesizy[localtilestart],(localtileend-localtilestart+1)<<1);
2460 kread(fil,&picanm[localtilestart],(localtileend-localtilestart+1)<<2);
2520 kread(fil,&dasiz,4);
2521 //Must store filenames to use cacheing system :(
2522 voxlock[voxindex][i] = 200;
2523 allocache(&voxoff[voxindex][i],dasiz,&voxlock[voxindex][i]);
2524 ptr = (char *)voxoff[voxindex][i];
2525 kread(fil,ptr,dasiz);
KDMENG.C में:
1155 kread(fil,&dawaversionum,4);
1156 if (dawaversionum != 0) { kclose(fil); return; }
1157
1158 kread(fil,&numwaves,4);
1159 for(i=0;i<numwaves;i++)
1160 {
1161 kread(fil,&instname[i][0],16);
1162 kread(fil,&wavleng[i],4);
1163 kread(fil,&repstart[i],4);
1164 kread(fil,&repleng[i],4);
1165 kread(fil,&finetune[i],4);
1194 kread(fil,snd,totsndbytes);
1214 kread(fil,&kdmversionum,4);
1215 if (kdmversionum != 0) return(-2);
1216 kread(fil,&numnotes,4);
1217 kread(fil,&numtracks,4);
1218 kread(fil,trinst,numtracks);
1219 kread(fil,trquant,numtracks);
1220 kread(fil,trvol1,numtracks);
1221 kread(fil,trvol2,numtracks);
1222 kread(fil,nttime,numnotes<<2);
1223 kread(fil,nttrack,numnotes);
1224 kread(fil,ntfreq,numnotes);
1225 kread(fil,ntvol1,numnotes);
1226 kread(fil,ntvol2,numnotes);
1227 kread(fil,ntfrqeff,numnotes);
1228 kread(fil,ntvoleff,numnotes);
1229 kread(fil,ntpaneff,numnotes);
इस कमजोरी के लिए PoC का परीक्षण निम्नलिखित वातावरणों का उपयोग करके किया गया है:
Build इंजन का उपयोग कई खेलों में किया गया है। नीचे Build इंजन पर आधारित खेलों की एक सूची है जिनका PoC के विरुद्ध परीक्षण किया गया है (जो sector चर को ओवरफ्लो करता है):
| खेल | रिलीज़ तिथि | संस्करण | स्थिति |
|---|
| Duke Nukem 3D | 1996 | 1.5 | vulnerable |
| Shadow Warrior | 1997 | 1.2 | vulnerable |
| Redneck Rampage | 1997 | 1.01 | vulnerable |
| Blood | 1997 | 1.0 | कमजोर नहीं |