Skip to main content

[Tutorial] Race condition attack trên ứng dụng web

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 :
[Tutorial] Race condition attack trên ứng dụng web | Juno_okyo's Blog
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 :
[Tutorial] Race condition attack trên ứng dụng web | Juno_okyo's Blog
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:
[Tutorial] Race condition attack trên ứng dụng web | Juno_okyo's Blog
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ề :
[Tutorial] Race condition attack trên ứng dụng web | Juno_okyo's Blog
Như vậy sau 10 request, tổng tiền chỉ bị trừ 10$ trong khi đã rút đến 8 lần.
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.
[Tutorial] Race condition attack trên ứng dụng web | Juno_okyo's Blog

Share this with your friends
Loading...