[Thesis] Ứng dụng máy học vào ModSecurity để bảo vệ web server tự động

Chào các bạn, lâu rồi mình cũng không viết gì, nhân dịp vừa bảo vệ xong luận văn mình viết lại đây xem như là một cột mốc đánh dấu kết thúc thời sinh viên, cũng như không muốn luận văn này bị chìm vào quên lãng.
Chân thành cảm ơn TS. Phạm Văn Hậu và bạn cùng làm Trương Thành Diện đã cùng mình hoàn thành khóa luận này.

Bài viết này mặc định các bạn đã biết cơ bản về cấu trúc luật của tường lửa web ModSecurity, và thứ mình làm ra là dùng để DEFENSE, không phải để attack, do đó nếu bạn tìm kiếm một kĩ thuật hack web cao siêu nào trong bài này thì… chờ bài khác của mình nha.

Dưới đây chỉ là những “main idea”, không phải toàn bộ khóa luận.
Demo (xem trên pc/laptop để đọc được sub):

https://www.youtube.com/watch?v=Fk6PoFjRXDE

Timeline:

6/2016: Bắt đầu đề tài với tên gọi AEGIS
9/2016: Hoàn thành nhưng kết quả không như mong đợi
10/2016: Đổi hướng tiếp cận trên cơ sở lý thuyết cũ với tên gọi mới USHIELD
12/2016: Hoàn thành
1/2017: Triển khai thử nghiệm ở một số trang web đâu đó tại Việt Nam
18/1/2017: Báo cáo khóa luận


Mô hình mạng triển khai trong đề tài này:


Nôm na là những request mình gửi từ Web Browser lên Web Server sẽ bị WAF ModSecurity chặn lại, và kiểm tra xem request này có hợp lệ hay không.

OK vào vấn đề chính, thứ mình xây dựng dựa được dựa trên ModSecurity, nghĩa là sử dụng ModSecurity để thực hiện những gì mình muốn (tự động chặn…v…v..)

Sau đây là workflow của chương trình:

Chương trình được chia làm 2 giai đoạn, giai đoạn học và giai đoạn phát hiện tấn công.

Tại giai đoạn học, chương trình sẽ thực hiện 4 bước sau:

Bước 1: Rút trích dữ liệu giữa web browser và web server


Để thực hiện điều này, chúng ta có thể sử dụng chính luật của ModSecurity, cụ thể:

SecRule ARGS,REQUEST_METHOD "^(GET|PUT|HEAD|OPTIONS|DELETE|CONNECT|TRACE)$" "pass,setenv:input_ip=%{REMOTE_ADDR},setenv:input_raw=http://%{SERVER_NAME}%{REQUEST_URI},exec:/var/www/modsecgui/public_html/exec/run_learning.sh,id:1999"

Luật trên sẽ được kích hoạt khi gặp REQUEST_METHOD là GET|PUT|HEAD|OPTIONS|DELETE|CONNECT|TRACE, khi kích hoạt, nó sẽ set các biến môi trường bằng setenv, ở đây ta sẽ set 2 biến có định dạng như sau:
input_raw=http://%{SERVER_NAME}%{REQUEST_URI}
input_ip=%{REMOTE_ADDR}
Sau đó luật này sẽ thực thi file /var/www/modsecgui/public_html/exec/run_learning.sh dựa vào exec

Nội dung file run_learning.sh:

#!/bin/sh
python /var/www/modsecgui/public_html/exec/learning.py -t $input_raw -s $input_ip

file này sẽ chạy script python learning.py với các tham số đầu vào được định nghĩa ở trên, xử lý và lưu lại vào cơ sở dữ liệu

Tương tự với phương thức POST:

SecRule ARGS,REQUEST_METHOD "^(POST)$" "pass,setenv:input_ip=%{REMOTE_ADDR},setenv:input_raw=http://%{SERVER_NAME}%{REQUEST_URI}?%{REQUEST_BODY},exec:/var/www/modsecgui/public_html/exec/run_learning.sh,id:2000"

Bước 2: Tính toán các giá trị liên quan dựa vào dữ liệu trên
Ở bước này, mình sẽ tính toán các giá trị đặc trưng của trường/ nhóm trường (thực hiện ở file learning.py).

Ví dụ: Độ dài trung bình, phương sai, độ lệch chuẩn, tần số kí tự..v…v..
Sau đó mình lưu những giá trị trên vào 1 bảng để làm “chuẩn” cho các request sau này. Các request gửi vào sẽ dựa vào chuẩn này để sinh ra được 8 “p” với từng truy vấn.

Trong đề tài này, mình quan tâm đến việc bảo vệ dựa trên hai thành phần:
Xét trên trường của câu truy vấn (VD: timkiem) dựa vào giá trị của trường truy vấn
Xét trên nhóm truy vấn dựa vào sự thay đổi của các trường trong câu truy vấn

Mỗi p được sinh ra dựa vào mỗi thuộc tính. Đề tài sử dụng 8 thuộc tính như sau

5 thuộc tính đầu tiên (màu xám) được dựa trên công trình nghiên cứu khoa học Anomaly Detection of Web-based Attacks rất nổi tiếng, tuy nhiên lúc thử nghiệm thì một số thuộc tính cho kết quả không tốt, nên mình đề xuất thêm 3 thuộc tính mới (màu vàng).

Chúng ta cùng đi xem xét từng thuộc tính:







Bước 3: Đưa dữ liệu rút trích được (dữ liệu sạch) và dữ liệu tấn công (lưu sẵn) vào 8 thuộc tính trên để xây dựng các giá trị của p

Đối với dữ liệu sạch, mình mark nó với kí tự ‘N’ nghĩa là không tấn công
Đối với dữ liệu tấn công, mình mark nó với kí tự ‘Y’ nghĩa là có tấn công

Sau khi trải qua quá trình training và đạt được ngưỡng mình đã định trước, một bảng chứa các giá trị p với mark ‘Y’/’N’ đã được sinh ra.
Chúng ta lại trở về bài toán kinh điển Decision Tree với chương trình dự báo thời tiết giúp xác định xem người chơi có đánh golf hôm nay không.

Bước 4: Sử dụng mô hình Cây Quyết Định để đưa ra các ngưỡng an toàn và tấn công

Tại giai đoạn phát hiện tấn công:

Đối với mỗi incoming request, ta có thể tính được 8 p tương ứng, đem so sánh p tính được với ngưỡng sinh ra từ Decision Tree để xác định cho phép request “vượt tường lửa hay không”

Thử nghiệm và kết quả:
Sử dụng tập dữ liệu CSIC 2010 chuyên để thử nghiệm các giải pháp tường lửa ứng dụng web được đề xuất bởi Viện An toàn thông tin thuộc Hội đồng nghiên cứu quốc gia Tây Ban Nha

CSIC 2010 bao gồm:
36.000 câu truy vấn an toàn
25.000 câu truy vấn có tấn công (Nhiều loại: SQLi, XSS, Command Inject ….v…v…)

Thu được kết quả khá tốt, lên đến hơn 96% (Kết quả trong bài nghiên cứu Anomaly Detection of Web-based Attacks chỉ đạt 94%)

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s