II/ T hc hành Lab:
BUFFER OVERFLOW I/ Lý thuy t
Trong các l nh v c an ninh máy tính và l p trình, m t l i tràn b nh đ m hay g i t t là l i tràn b đ m là m t l i l p trình có th gây ra m t ngo i l truy nh p b nh máy tính và ch ng trình b k t thúc, ho c khi ng i dùng có ý phá ho i, h có th l i d ng l i này đ phá v an ninh h th ng.
L i tràn b đ m là m t đi u ki n b t th ng khi m t ti n trình l u d li u v t ra ngoài biên c a m t b nh đ m có chi u dài c đnh. K t qu là d li u đó s đè lên các v trí b nh li n k . D li u b ghi đè có th bao g m các b nh đ m khác, các bi n và d li u đi u khi n lu ng ch y c a ch ng trình (program flow control).
Các l i tràn b đ m có th làm cho m t ti n trình đ v ho c cho ra các k t qu sai. Các l i này có th đ c kích ho t b i các d li u vào đ c thi t k đ c bi t đ th c thi các đo n mã phá ho i ho c đ làm cho ch ng trình ho t đ ng m t cách không nh mong đ i. B ng cách
đó, các l i tràn b đ m gây ra nhi u l h ng b o m t (vulnerability) đ i v i ph n m m và t o c s cho nhi u th thu t khai thác (exploit). Vi c ki m tra biên (bounds checking) đ y đ b i l p trình viên ho c trình biên d ch có th ng n ch n các l i tràn b đ m.
Mô t k thu t
M t l i tràn b nh đ m x y ra khi d li u đ c vi t vào m t b nh đ m, mà do không ki m tra biên đ y đ nên đã ghi đè lên vùng b nh li n k và làm h ng các giá tr d li u t i các
đa ch b nh k v i vùng b nh đ m đó. Hi n t ng này hay x y ra nh t khi sao chép m t xâu ký t t m t b nh đ m này sang m t vùng b nh đ m khác.
Ví d c b n
Trong ví d sau, m t ch ng trình đã đnh ngh a hai ph n t d li u k nhau trong b nh : A là m t b nh đ m xâu ký t dài 8 bytes, và B là m t s nguyên kích th c 2 byte. Ban đ u, A ch ch a toàn các byte giá tr 0, còn B ch a giá tr 3. Các ký t có kích th c 1 byte.
Bây gi , ch ng trình ghi m t xâu ký t "excessive" vào b đ m A, theo sau là m t byte 0 đ đánh d u k t thúc xâu. Vì không ki m tra đ dài xâu, nên xâu ký t m i đã đè lên giá tr c a
Tuy l p trình viên không có ý đnh s a đ i B, nh ng giá tr c a B đã b thay th b i m t s
đ c t o nên t ph n cu i c a xâu ký t . Trong ví d này, trên m t h th ng big-endian s d ng mã ASCII, ký t "e" và ti p theo là m t byte 0 s tr thành s 25856.
N u B là ph n t d li u duy nh t còn l i trong s các bi n đ c ch ng trình đnh ngh a, vi c vi t m t xâu ký t dài h n n a và v t quá ph n cu i c a B s có th gây ra m t l i ch ng h n nh segmentation fault (l i phân đo n) và ti n trình s k t thúc.
Tràn b nh đ m trên stack
Bên c ch vi c s a đ i các bi n không liên quan, hi n t ng tràn b đ m còn th ng b l i d ng (khai thác) b i tin t c đ làm cho m t ch ng trình đang ch y th c thi m t đo n mã tùy ý đ c cung c p. Các k thu t đ m t tin t c chi m quy n đi u khi n m t ti n trình tùy theo vùng b nh mà b đ m đ c đ t t i đó. Ví d , vùng b nh stack, n i d li u có th đ c t m th i "đ y" xu ng "đnh" ng n x p (push), và sau đó đ c "nh c ra" (pop) đ đ c giá tr c a bi n. Thông th ng, khi m t hàm (function) b t đ u th c thi, các ph n t d li u t m th i (các bi n đa ph ng) đ c đ y vào, và ch ng trình có th truy nh p đ n các d li u này trong su t th i gian ch y hàm đó. Không ch có hi n t ng tràn stack (stack overflow) mà còn có c tràn heap (heap overflow).
Trong ví d sau, "X" là d li u đã t ng n m t i stack khi ch ng trình b t đ u th c thi; sau đó ch ng trình g i hàm "Y", hàm này đòi h i m t l ng nh b nh cho riêng mình; và sau đó "Y" g i hàm "Z", "Z" đòi h i m t b nh đ m l n:
N u hàm "Z" gây tràn b nh đ m, nó có th ghi đè d li u thu c v hàm Y hay ch ngtrình chính:
i u này đ c bi t nghiêm tr ng đ i v i h u h t các h th ng. Ngoài các d li u th ng, b nh stack còn l u gi đ a ch tr v , ngh a là v trí c a ph n ch ng trình đang ch y tr c khi hàm hi n t i đ c g i. Khi hàm k t thúc, vùng b nh t m th i s đ c l y ra kh i stack, và th c thi đ c trao l i cho đ a ch tr v . Nh v y, n u đa ch tr v đã b ghi đè b i m t l i tràn b đ m, nó s tr t i m t v trí nào đó khác. Trong tr ng h p m t hi n t ng tràn b
đ m không có ch ý nh trong ví d đ u tiên, h u nh ch c ch n r ng v trí đó s là m t v trí không h p l , không ch a m t l nh nào c a ch ng trình, và ti n trình s đ v . Tuy nhiên, m t k t n công có th ch nh đ a ch tr v đ tr t i m t v trí tùy ý sao cho nó có th làm t n h i an hinh h th ng.
trình s t o ra m t l i tràn b đ m n u nó đ c g i v i m t tham s dòng l nh là m t xâu ký t quá dài, vì tham s này đ c dùng đ ghi vào m t b nh đ m mà không ki m tra đ dài c a nó.
************
/* overflow.c - demonstrates a buffer overflow */ #include
#include
int main(int argc, char *argv[]) {
char buffer[10]; if (argc < 2) {
fprintf(stderr, "USAGE: %s string\n", argv[0]); return 1; } strcpy(buffer, argv[1]); return 0; } ************
Các xâu ký t đ dài không quá 9 s không gây tràn b đ m. Các xâu ký t g m t 10 ký t tr lên s gây tràn b đ m: hi n t ng này luôn luôn là m t l i sai nh ng không ph i lúc nào c ng gây ra vi c ch ng trình ch y sai hay gây l i segmentation faults
#include #include
int main(int argc, char *argv[]) {
char buffer[10]; if (argc < 2) {
fprintf(stderr, "USAGE: %s string\n", argv[0]); return 1;
}
strncpy(buffer, argv[1], sizeof(buffer)); buffer[sizeof(buffer) - 1] = '\0';
return 0; } *******
Khai thác
Có các k thu t khác nhau cho vi c khai thác l i tràn b nh đ m, tùy theo ki n trúc máy tính, h đi u hành và vùng b nh . Ví d , khai thác t i heap (dùng cho các bi n c p phát đ ng) r t khác v i vi c khai thác các bi n t i stack.
Khai thác l i tràn b đ m trên stack
M t ng i dùng th o k thu t và có ý đ x u có th khai thác các l i tràn b đ m trên stack
đ thao túng ch ng trình theo m t trong các cách sau:
ti p t c t i đa ch mà k t n công đã ch rõ, th ng là t i m t b đ m ch a d li u vào c a ng i dùng.
N u không bi t đa ch c a ph n d li u ng i dùng cung c p, nh ng bi t r ng đa ch c a nó
đ c l u trong m t thanh ghi, thì có th ghi đè lên đa ch tr v m t giá tr là đa ch c a m t opcode mà opcode này s có tác d ng làm cho th c thi nh y đ n ph n d li u ng i dùng. C th , n u đa ch đo n mã đ c h i mu n ch y đ c ghi trong m t thanh ghi R, thì m t l nh nh y đ n v trí ch a opcode cho m t l nh jump R, call R (hay m t l nh t ng t v i hi u ng nh y đ n đa chi ghi trong R) s làm cho đo n mã trong ph n d li u ng i dùng đ c th c thi. Có th tìm th y đa ch c a các opcode hay các byte thích h p trong b nh t i các th vi n liên k t đ ng (DLL) hay trong chính file th c thi. Tuy nhiên, đa ch c a opcode đó th ng không đ c ch a m t ký t null (hay byte 0) nào, và đa ch c a các opcode này có th khác nhau tùy theo các ng d ng và các phiên b n c a h đi u hành.D án Metapoloit là m t trong các c s d li u ch a các opcode thích h p, tuy r ng trong đó ch li t kê các opcode trong h đi u hành Microsoft Windows.
Khai thác l i tràn b đ m trên heap
M t hi n t ng tràn b đ m x y ra trong khu v c d li u heap đ c g i là m t hi n t ng tràn heap và có th khai thác đ c b ng các k thu t khác v i các l i tràn stack. B nh heap
đ c c p phát đ ng b i các ng d ng t i th i gian ch y và th ng ch a d li u c a ch ng trình. Vi c khai thác đ c th c hi n b ng cách phá d li u này theo các cách đ c bi t đ làm cho ng d ng ghi đè lên các c u trúc d li u n i b ch ng h n các con tr c a danh sách liên k t. L h ng c a Microsoft JPG GDI+là m t ví d g n đây v s nguy hi m mà m t l i tràn heap.