-------------------------------------------------------------------
Nguồn : ktavpro
http://antoanthongtin.wordpress.com/
--------------------------------------------------------------------------------------------------------------
Tác giả + Share: g4mm4
_http://www.slideshare.net/XchymHip/final-raceconditionintheweb
video + PoC mình để ở đây:
_http://dl.dropbox.com/u/11027388/vnisa-race-condition-attacks-material.zip
video + PoC mình để ở đây:
_http://dl.dropbox.com/u/11027388/vnisa-race-condition-attacks-material.zip
----------------------------------------------------------------------------------------------------------------
Hôm qua may mắn gặp anh Hoàng Quốc Thịnh và nghe bài của anh ấy về vấn đề này ở Ngày ATTT 2012 làm mình càng thấm hơn 1 điều đã thấm từ lâu :
- Nếu được học lại đại học mình sẽ học thật kỹ tất cả các môn cơ bản, từ asm, vi xử lý, kiến trúc hệ điều hành,…. bla bla bla để giờ khỏi hối tiếc và không còn thời gian đề nhồi nhét lại.
Race condition là một vấn đề không mới, mình cũng đã biết từ lâu nhưng toàn trên linux. Để hiểu race condition trên web ta xem 1 ví dụ như sau :
Người A có 10000 $ trong tài khoản, anh ta thực hiện rút 5 lần cùng lúc từ internet banking (bỏ qua 1 số token bảo vệ nhé), mỗi lần 10$, nhưng trong tài khoản chỉ trừ 10$ thôi (lẽ ra phải trừ 50). Vậy lỗi xảy ra ở đâu ?
Xem xét đoạn code sau của ngân hàng trong việc trừ tiền :
Khi tiến trình 1 đang thực hiện câu lệnh $tongtien = $tongtien – $sotien thì một tiến trình 2 của người A đang đòi rút chèn ngang, lúc này hệ thống sẽ tạm dừng tiến trình 1 đang xử lý để quay sang xử lý tiến trình 2 :
Lúc này khi bắt đầu xử lý tiến trình 2, tổng tiền chưa được cập nhật bởi tiến trình 1 đã tạm dừng. Do đó số tiền trong tk lúc này vẫn là 10000 và sau khi thực hiện xong cả 2 tiến trình thì tổng tiền vẫn là 9990 mặc dù đã rút 2 lần. Như vậy race condition đã xảy ra khi mà 1 tiến trình chèn ngang tiến trình khác trong lúc các tham số vẫn chưa kịp cập nhật.
Ở đây mình tạo 1 đoạn code lấy tiền với khá nhiều việc, làm cho thời gian xử lý nó lên tới tận 1,2s và cố thử rút 8 lần mà chỉ bị trừ 10$
B1, kiểm tra tài khoản ban đầu và xem access log , lúc này ta đang có 10000:
B2, Xử dụng 1 đoạn python để cùng 1 lúc gửi 8 request, mỗi request đều rút 10$ trong cùng 1 thời gian và xem kết quả trả về :
B3. Kiểm tra log file ta thấy 8 request này tới cùng lúc. Và bởi vì server phải đòi hỏi đến 1 giây để xử lý 1 giao dịch, do đó 8 request này đã làm xuất hiện race condition và bị chèn ngang lẫn nhau.
No comments:
Post a Comment