חידה

gilad_no

New member
חידה

להלן קוד שנלקח מקוד חלונות ששוחרר לאחרונה. בקוד ישנה פירצת אבטחה. נסו למצוא.
while (_bmfh.bfOffBits > (unsigned)cbRead) { BYTE abDummy[1024]; int cbSkip; cbSkip = _bmfh.bfOffBits - cbRead; if (cbSkip > 1024) cbSkip = 1024; if (!Read(abDummy, cbSkip)) goto Cleanup; cbRead += cbSkip; }​
 

gilad_no

New member
דווקא לא כאן הבעיה ...

GOTO זה מגעיל, אבל עדיין לא פירצה ...
 

ChipsMan

New member
אממ..

שכחו לבדוק מה קורה אם cbSkip < 0?
 

Jaguar7

New member
לא נראה לי שיכול לקרות

שים לב שבwhile בודקים ש cbOffBits גדול מ cbRead ולכן לא יכול להיות ש cbSkip < 0. אבל אני לא בטוח חד משמעית.
 

Jaguar7

New member
ניחוש

הם לא לקחו בחשבון שיכול להיות שתקרא יותר מ1024 בייטים? (יכול מאוד להיות שאני מדבר שטויות) אם מה שאני אומר נכון אז היה צריך לעשות את זה ככה, לא? BYTE* abDummy = new BYTE[cbSkip] ?
 

gilad_no

New member
לקחו בחשבון

יש בדיקה ואם זה גדול מ1024, הם משנים ל1024. תחשבו טוב ...
 

ברנדל

New member
לפי דעתי

עשו כאן המרה ל unsigned, כלומר זה לא היה היצוג הראשוני של המספר ויכול להיות שהוא חורג מ 2 בחזקת 32. לאחר מכן משתמשים במספר כאילו כלום. אין לי מושג מה הפונקציה אמורה לעשות יכול להיות שמלחתחילה היתה איפה שהוא הגבלה על cbRead , אבל עצם ההמרה מעוררת חשד
 

DarkSwell

New member
מה השטויות האלה..

הקוד הזה אפילו לא עובר קומפילציה, הוא לא תקין. אז אם כבר חידה אז בבקשה שתהיה מציאותית!
 

DNile

New member
bfOfffBits > MAX_INT

(0xFFFFFFFF למשל), וcbRead = 0x10. יצא שcbSkip = 0xFFFFFFEF, שזה בעצם -17. cbSkip > 1024 יחזיר false, והקריאה לRead, שבטח מקבלת unsigned בפרמטר השני, תקבל את הערך 0xFFFFFFEF, שבמקרה הזה יהיה הרבה יותר גדול מהבאפר המסכן של 1024 בתים.
 

DNile

New member
אני דביל...

שמתי חלק מהפתרון בכותרת.. מצטער... גלעד, אם אתה יכול למחוק, אני אכתוב שוב פעם עם הכותרת: "פתרון".
 

gilad_no

New member
לא נורא (והסבר נוסף ...)

קרוב מאוד. הטעות הינה בהגדרת המשתנה בתור INT במקום UNSIGNED. אם מכניסים ערך גדול, הבדיקה <1024 תעבור, אבל לאחר מכן, READ מבצע המרה לUNSIGNED ונוצרת פירצת BUFFER OVERFLOW עם אפשרות להכנסת קוד זדוני. ולמי שזה מעניין אותו, זה הקוד לטעינת BMP, מה שאומר שניתן לשים קובץ בסיומת BMP על אתר אינטרנט, שיפעיל קוד ברגע שהמשתמש טוען את התמונה בדפדפן.
 

DNile

New member
אההה.. נו..

זאת הפרצה שגילו עכשיו לא מזמן... http://lists.netsys.com/pipermail/full-disclosure/2004-February/017364.html
 
למעלה