You are on page 1of 12

Học Viện Kỹ Thuật Mật Mã

Khoa An Toàn Thông Tin

BÀI TẬP LỚN


Kỹ thuật lập trình an toàn

Đề tài : Race Condition

Sinh Viên Thực Hiện :

1.Nguyễn Ngọc Hiếu - AT15G -

2.Nguyễn Tấn Dũng - AT15G -

3.Ngô Xuân Hà - AT15G -

4.Trần Đại Nghĩa - AT15G -

1
Hà Nội – Tháng 11/2022

2
NHẬN XÉT CỦA GIÁO VIÊN

ĐIỂM

…………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
…………………………………….
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
…………………………………….
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
……………………………………………………………………………………………
3
……………………………………………………………………………………………
………………....

MỤC LỤC

CHƯƠNG I: KHÁI NIỆM RACE CONDITION..............................................................................................5

CHƯƠNG II: THỰC HÀNH VỚI LỖI RACE CONDITION...........................................................................6

2.1. Kịch bản thực hành.................................................................................................................................6

2.2. Mục tiêu bài thực hành............................................................................................................................7

2.3. Môi trường thực hành.............................................................................................................................7

2.4. Các bước thực hiện.................................................................................................................................7

4
CHƯƠNG I: KHÁI NIỆM RACE CONDITION
Race condition là một tình huống xảy ra khi nhiều threads cùng truy cập và cùng
lúc muốn thay đổi dữ liệu (có thể là một biến, một row trong database, một vùng
shared data, memory , etc...). Vì thuật toán chuyển đổi việc thực thi giữa các
threads có thể xảy ra bất cứ lúc nào, nên không thể biết được thứ tự của các
threads truy cập và thay đổi dữ liệu đó sẽ dẫn đến giá trị của data sẽ không như
mong muốn. Kết quả sẽ phụ thuộc vào thuật toán thread scheduling của hệ điều
hành. Quá trình các threads thực thi lệnh trông như 1 cuộc đua giữa các vận động
viên điền kinh olympic vì vậy có thể liên tưởng đến thuật ngữ "Race condition".

Nếu một chương trình vướng phải lỗi này, người tận dụng lỗi có thể chạy nhiều
tiến trình song song để "race" với chương trình có lỗi, với mục đích là thay đổi
hoạt động của chương trình ấy. Đôi khi, trường hợp đua còn được biết đến với tên
gọi thời điểm kiểm tra/thời điểm sử dụng (Time Of Check/Time Of Use,
TOC/TOU).

Ví dụ : Giả sử có hai luồng A và B như hình dưới đây. Luồng A tăng

biến được chia sẻ Count lên 1 và luồng B giảm Count đi 1.

Nếu cả hai câu lệnh không được bảo vệ, việc thực hiện các lệnh có thể

được xen kẽ do chuyển đổi ngữ cảnh.

 Trong khi luồng A đang trong quá trình thực thi Count ++, hệ thống có thể
chuyển A ra và để luồng B chạy.
 Tương tự, khi luồng B đang trong quá trình thực thi Đếm--, hệ thống có thể
chuyển luồng B ra ngoài và để luồng A chạy.

5
Ba thuộc tính để race condition tồn tại :

 Tương tranh : Ít nhất 2 luồng điều khiển phải đang thực thi đồng thời
 Đối tượng được chia sẻ: Cả 2 luồng phải đồng thời truy nhập tới đối tượng
race được chia sẻ

 Thay đổi trạng thái : Ít nhất một luồng điều khiển phải thay đổi trạng thái
của đối tượng race

CHƯƠNG II: THỰC HÀNH VỚI LỖI RACE CONDITION


2.1. Kịch bản thực hành

Tạo một account bank example.

Hãy xem xét mã PHP sau để rút tiền hoặc tín dụng từ một số loại tài khoản trực
tuyến. Giả sử getBalance() và setBalance() là các hàm tải/lưu trữ số dư tài khoản từ
cơ sở dữ liệu MySQL.

Chỉ cần nhận số dư, xem nếu có đủ tiền trong tài khoản, và nếu vậy, hãy tiến hành
giao dịch và khấu trừ số tiền từ số dư. Dễ dàng, phải không? Sai. Chức năng này,
mặc dù nó thực hiện trong chưa đến một nửa số mili giây trên PC của tôi, nhưng dễ
bị tấn công race condition cho phép kẻ tấn công rút tiền mà không làm giảm số dư.
Cuộc tấn công là thực tế và thậm chí có thể được thực hiện qua Internet.
6
2.2. Mục tiêu bài thực hành

Hiểu được nguyên nhân dẫn đến race condition và biết cách khai thác.

2.3. Môi trường thực hành

Yêu cầu phần mềm trên máy:

+ Trình soạn thảo code: vscode/sublime text/netbeans/… Trong bài hướng


dẫn này sẽ sử dụng Vscode.

+ Chương trình tạo máy chủ web: Xampp

+ Python2 và php chạy trên kali

Yêu cầu kết nối Internet: Không

2.4. Các bước thực hiện

Tải thử mục race-condition theo đường link sau :


https://drive.google.com/file/d/1hyzpbWn8LeY_Zhrl1QA9Jmnu545i4oGZ/view?
usp=sharing

Giải nén vào htdocs trong xampp

Bước 1: Mở Xampp start Apache và MySQL

7
Bước 2: Truy cập vào http://localhost:8080/phpmyadmin để Import database.

Chọn Import -> Choose File (chọn file test.sql trong folder race-condition đã tải) -
>go

Bước 3 :

Truy cập vào localhost để xem số dư tài khoản BANK000001:

Nếu chúng ta thêm trường amount là số tiền cần rút :

8
Bước 4 : Khai thác lỗ hổng race condition

Sử dụng file withdraw_normal.py

Mô tả : file thực thi này chạy bằng python2. Cho phép chúng ta rút 100 đô 4 lần
bằng vòng lặp for.

Để thực thi được file này cần thay đổi localhost sang địa chỉ ip chạy xampp.

Đây là bước rút tiền bình thường.


9
Lúc này số tiền trong tk BANK000001 : 19400

Logic xảy ra hoàn toàn đúng.

Khai thác race condition.

Sử dụng file khai thác withdraw_race.py

Mô tả : file này sẽ chạy cùng 1 lúc nhiều tiến trình rút tiền để CPU xử lý cùng lúc.
Sử dụng hàm fork trong python2. Hàm fork được hiểu là mỗi lần gọi thì chúng
sẽ nhân đôi số lượng tiến trình được tạo ra. Hiện trong file mình đang cho chạy
8 tiến trình.

Lưu ý : file này chỉ có thể thực thi được trên linux vì window không hỗ trợ fork.

Tài khoản BANK000001 lúc này đang có 20000$:

Sử dụng withdraw_race.py để gửi cùng lúc 16 gói tin.

10
Sau khi truy cập lại số tk :

20000 -1600 = 18500 ????

Chúng ta đã gian lận được 100$.

Tiến hành khai thác thành công

11
12

You might also like