7 Tổng kết
2.10 Minh họa SVM
SVM cung cấp bộ phân loại với độ chính xác cao và hoạt động tốt khi giữa các lớp có sự phân tách rõ ràng. Tuy nhiên, SVM không phù hợp với các bộ dữ liệu lớn vì thời gian huấn luyện lâu đồng thời hoạt động kém với trường hợp các lớp bị chồng chéo và nhạy cảm với dữ liệu nhiễu.
2.4 Lỗ hổng bảo mật trên ứng dụng web
PHP được tạo ra bởi Rasmus Lerdorf vào năm 1994 sau đó được hoàn hiện hơn bởi nhóm nghiên cứu PHP. Nhờ vào tính ứng dụng dễ dàng với một lượng lớn các hàm chức năng sẵn có, PHP nhanh chóng được ưa chuộng và ứng dụng rộng rãi: trình thông dịch PHP đã được cài đặt trên 10% các máy chủ web vào năm 1998 và được sử dụng bởi 79.1% các trang web ngày nay [29].
Tuy nhiên, sự linh hoạt được đánh đổi bởi tính không nhất quán của ngôn ngữ, sự thiếu an toàn của thiết lập mặc định, . . . dẫn đến việc xuất hiện nhiều lỗi và lỗ hổng trong các ứng dụng PHP. Trong mục này, trước tiên chúng tôi giới thiệu một số đặc trưng
của ngôn ngữ PHP. Nội dung này sẽ cung cấp một cái nhìn tổng quan về những vấn đề đối với mã nguồn PHP. Sau đó, chúng tôi giới thiệu các lỗ hổng dạng taint-style trong chỉ mục 2.4.2, loại lỗ hổng bảo mật phổ biến nhất trong các ứng dụng PHP. Bằng cách xem các loại lỗ hổng dễ bị khai thác, chúng tôi có thể định hướng cho quá trình tìm kiếm phương pháp phát hiện tự động các lỗ hổng này trong mã nguồn.
2.4.1 Sự phức tạp của ngôn ngữ PHPDynamic và Weak Typing Dynamic và Weak Typing
PHP là ngôn ngữ kiểu động (dynamic type). Điều này cho phép biến được sử dụng mà không cần phải khai báo rõ ràng trước đó. Kiểu của biến phụ thuộc vào giá trị được gán cho biến và được xác định khi chương trìnht thực thi (runtime). Không những vậy, PHP hoạt động theo kiểu weak type, nghĩa là các biến không bắt buộc phải thuộc một kiểu cố định, các kiểu dữ liệu có thể được sử dụng trộn lẫn với nhau [9]. Ví dụ, trong đoạn mã 2.1, ở dòng 1 kiểu chuỗi (string) của“3”và “5”đã tự động chuyển thành kiểu số nguyên 3 và 5, dẫn đến giá trị của biến $var là 1. Tương tự, ở dòng số 2, biến số nguyên $var1 đã ngầm định chuyển thành kiểu chuỗi để thực hiện nối chuỗi với biến $var2. Kết quả kiểu chuỗi“8 tests” được lưu trong biến mà trước đó mang kiểu nguyên$var1.
1 $var1 = "3" + "5"; // $var1 === 8
2 $var2 = " tests "
3 $var1 = $var1 . Svar2 ; // $var1 === "8 tests "
Code 2.1: Minh họa dynamic type và weak type trong PHP
Dynamic Arrays
Mảng trong PHP là các bảng băm (hash-table) ánh xạ các số hoặc chuỗi (thường được gọi là khóa - key) tới các giá trị. Giá trị khóa luôn phải là duy nhất. Trong trường hợp lược bỏ khóa khi khai báo mảng, PHP sẽ ngầm liên kết giá trị với một chỉ số, bắt đầu từ 0 hoặc từ giá trị khóa cao nhất xuất hiện và tăng dần thêm 1. Chỉ số này được xem như khóa mặc định tương ứng của phẩn tử trong mảng (Minh họa 2.2).
1 $arr = array ( ’a ’ , "4" = > ’b ’ , ’ foo ’ = > ’c ’ , ’d ’) ;
2 // Array ( [0] = > a [4] = > 6 [ foo ] = > c [5] = > d ) Code 2.2: Minh họa dynamic array trong PHP
Dynamic Code
Trong PHP có một số hàm chức năng cho phép thực thi trực tiếp mã được truyền vào dưới dạng chuỗi cho tham số của hàm. Rất khó để phân tích các mã thực thi được sinh động trong trường hợp này, vì chúng chỉ được biết đến trong thời gian thực thi. Một số hàm có khả năng này làeval(), assert(), . . . .
1 p r e g _ r e p l a c e ("/\\ x [a - f0 -9]{2}/ ie " , " chr ( hexdec (\\1) ) " , $str ) ; Code 2.3: Minh họa dynamic code trong PHP
Chương 2
Một ví dụ khác về việc sinh mã động được thể hiện trong 2.3. Ở đây, hàmpreg_replace() thực hiện tìm kiếm biểu thức được xác định trong tham số đầu tiên và thay thế các chuỗi đã khớp bằng chuỗi đã cho trong tham số thứ hai. Ở đoạn mã minh họa, modifieređược sử dụng, chuỗi thay thế được xem xét như một mã PHP và được thực thi trước quá trình tìm kiếm và thay thế. Hành vi này có thể dẫn đến các lỗ hổng bảo mật nghiêm trọng khi không được sử dụng thận trọng [12].
2.4.2 Lỗ hổng kiểu Taint-style
Đối với ứng dụng web PHP, ngoại trừ các lỗi gây ra do sai sót trong logic của đoạn mã chương trình, các lỗi còn lại có thể khái quát thành vấn đề liên quan đến dòng chảy của thông tin dẫn đến vi phạmtính bảo mật và tính toàn vẹn của ứng dụng. Kẻ tấn công có thể khai thác vấn đề này bằng cách đưa đầu vào độc hại có thể thay đổi hành vi hoặc kết quả của một hàm chức năng trong ứng dụng [103]. Loại lỗ hổng này được gọi là lỗ hổng kiểu Taint-style, do một nguồn (source) không đáng tin cậy, chẳng hạn như dữ liệu do người dùng cung cấp thông qua các tham số có chứa mã độc hại, được truyền vào và xử lí bởi phần dễ bị tổn thương của chương trình (sensitive sink).
Trong luận văn này, chúng tôi sẽ khảo sát hai loại lỗ hổng taint-style phổ biến: SQL Injection và Cross Site Scripting.
Đầu vào có thể bị kiểm soát
Đối với lỗ hổng tain-style, trong quá trình kiểm tra mã nguồn, cần chú ý đến các nguồn (source) của dòng thông tin có thể bị khai thác. Đối với ngôn ngữ PHP, có nhiều nguồn nhận dữ liệu có thể bị kiểm soát bởi kẻ tấn công, phổ biến là.
• $_GET: Mảng chứa các tham số GET được truyền vào URL và được lưu dưới dạng cặp khóa - giá trị trong mảng. Mảng này cũng được sử dụng với POST request, chứa các tham số xuất hiện trong URL.
• $_POST:Mảng chứa các dữ liệu được gửi trong phần body của POST request. Tương tự như $_GET, dữ liệu được lưu vào mảng ở dạng cặp khóa - giá trị.
• $_COOKIE: Nơi PHP lưu trữ dữ liệu cookie đã được tách ra từ request. Dữ liệu này được gửi đến server trong header Cookie.
• $_REQUEST: Mảng chứa sự kết hợp của tất cả các mảng ở trên. Trường hợp một tham số xuất hiện trong nhiều hơn một mảng, $_REQUEST lưu tham số này dựa theo mức độ ưu tiên của các mảng trên. (ví dụ: $_GET có độ ưu tiên cao hơn $_COOKIE)
• $_SERVER:Mảng chứa thông tin như header, đường dẫn và vị trí tập lệnh. Các phần tử trong mảng này được tạo bởi web server.
• $_FILES:Mảng được sử dụng trong việc upload file qua POST request. Trong mảng chứa toàn bộ thông tin và nội dung file được gửi, bao gồm tên file, MIME, kích thước file,...
SQL Injection
SQL là ngôn ngữ truy vấn được sử dụng để tương tác (lưu trữ, thao tác và truy xuất dữ liệu) với cơ sở dữ liệu. SQL Injection là loại tấn công lợi dụng sự thiếu sót trong quá trình kiểm tra đoạn lệnh được thực thi giúp kẻ tấn công chèn vào câu lệnh SQL để khai thác hoặc làm thay đổi thông tin được lưu trữ trong cơ sở dữ liệu.
Second order SQL Injection bị khai thác khi dữ liệu do người dùng cung cấp được ứng dụng lưu trữ và sau đó được sử dụng vào các truy vấn SQL theo cách không an toàn. Để phát hiện lỗ hổng, thông thường cần phải gửi dữ liệu để lưu ở một vị trí, sau đó sử dụng một số chức năng khác của ứng dụng thực hiện truy vấn dữ liệu theo cách không an toàn.Ví dụ ở đoạn mã sau.
1 $ b a l a n c e = m y s q l _ q u e r y (" SELECT balance FROM usrs WHERE u s e r n a m e = ‘". $name ." ’") ;
Code 2.4: Minh họa lỗ hổng SQL Injection trong PHP
Giả sử giá trị của tham số$name được lấy từ trườngusernamecủa dữ liệu được lưu trong bảng dữ liệu từ trước đó. Kẻ tấn công đã sử dụng chức năng đăng kí để tạo 1 tài khoản với trườnguser_name là a’ OR ”=’. Sau khi đăng nhập, kẻ tấn công sử dụng chức năng xem số dư tài khoản và gọi đến câu lệnh SQL ở trên. Do tham số $name được trực tiếp đưa vào câu lệnh SQL mà không bị kiểm tra tính hợp lệ, câu lệnh SQL được thực thi lúc này trở thành SELECT balance FROM users WHERE user_name=‘a’ OR ”=” và cho phép kẻ tấn công truy cập vào thông tin được bảo mật của tài khoản khác.
Khi phân tích lỗ hổng SQL Injection, cần lưu ý đến các hàm trong PHP có thể là mục tiêu của kẻ tấn công như mysql_query, pg_query, sqlite_query hay một số hàm thường được dùng để kiểm tra, loại bỏ các kí tự gây ảnh hưởng đến câu lệnh truy vấn như mysql_real_escape_string, pg_escape_stringhoặc mysqli_real_escape_string.
Cross Site Scripting
Cross Site Scripting là lỗ hổng bị khai thác nhằm vào client. Mục tiêu của kẻ tấn công là chèn các đoạn script nguy hiểm vào trong source code ứng dụng web và thực thi các đoạn mã độc này trên trình duyệt của người dùng. Thông qua đó, kẻ tấn công có thể chiếm phiên đăng nhập của người dùng, phá hoại website hoặc điều hướng người dùng tới một trang web nguy hiểm khác. Xét đoạn mã minh họa.
1 echo " Hello ". $_GET [" u s e r n a m e "];}
Code 2.5: Minh họa lỗ hổng XSS trong PHP
Khi tham số $_GET[‘username’] không được kiểm tra, lỗi XSS sẽ bị khai thác nếu giá trị được truyền vào cho tham số này là <script>alert(document.cookie)</script>. Khi đó, trình duyệt sẽ thực thi đoạn mã độc này và hiển thị giá trị cookie của người dùng thay vì nội dung mong muốn ban đầu.
PHP cũng tích hợp sẵn các hàm hỗ trợ kiểm tra lọc sạch các giá trị truyền vào nhằm khai thác lỗ hổng XSS như htmlspecialchars, htmlentities.
3
Những nghiên cứu liên quan
Trong quá trình nghiên cứu các tài liệu cho luận văn, chúng tôi trước tiên tìm hiểu về một số công cụ đã được hiện thực để giải quyết các bài toán tương tự và tập trung vào sự khác biệt khi công cụ có và không có sự hỗ trợ của các kĩ thuật hướng dữ liệu. Sau đó, chúng tôi định hướng nghiên cứu xoáy sâu vào hai baì toán cần được giải quyết khi xây dựng công cụ hỗ trợ tìm kiếm lỗ hổng bảo mật trong mã nguồn sử dụng các kĩ thuật học máy là.
• Biểu diễn và vector hóa dữ liệu mã nguồn như thế nào? • Lựa chọn mô hình học máy nào là phù hợp?
Các nghiên cứu được đề cập trong chương này sẽ xoay quanh vấn đề chính đã nêu trên và là nền tảng cho việc thiết kế và hiện thực công cụ ở những chương sau. Để nắm bắt được xu hướng của các nghiên cứu cùng lĩnh vực, cũng như tìm hiểu được nhiều phương pháp để giải quyết cho từng bái toán con được đặt ra, chúng tôi mở rộng tìm hiểu cả những bài nghiên cứu hướng đến ngôn ngữ khác ngoài PHP và áp dụng những kĩ thuật học trên dữ liệu ngoài học máy.
3.1 Công cụ tìm kiếm lỗ hổng 3.1.1 Công cụ sử dụng kỹ thuật cơ bản
Trước hết, chúng tôi xem xét các công cụ với phương pháp kiểm tra truyền thống, cơ bản và không sử dụng các kĩ thuật như học máy, học sâu, . . .
Pixy. Pixy[14] ban đầu được phát triển bởi Oliver Klee, là một công cụ phân tích mã tĩnh dùng để kiểm tra lỗ hổng bảo mật cho các ứng dụng PHP. Công cụ sử dụng các yếu tố liên quan đến phân tích dòng thưc thi nhạy cảm, dòng dữ liệu nhạy cảm, quy trình liên thủ tục (interprocedural) để phát hiện ra các lỗ hổng tồn tại trong chương trình. Mục tiêu của công cụ nhằm vào các loại lỗ hổng kiểu taint-style như SQL injection và Cross-site Scripting.
RIPS. RIPS[8] là công cụ tự động phát hiện lỗ hổng trong các ứng dụng PHP, được tạo ra bởi Johannes Dahse. RIPS thực hiện chia mã nguồn thành các token và chuyển đổi mã nguồn PHP thành một mô hình thích hợp cho quá trình phân tích. Sau đó, một
danh sách các hàm tiềm ẩn bị tổn thương (Potential Vulnerable Function) được đối chiếu để tìm kiếm các thành phần có thể bị khai thác và sau đó truy ngược lại luồng dữ liệu để kiểm tra liệu đầu vào của dữ liệu tới hàm này có thể bị khai thác và nhiễm mã độc hay không.
Hai công cụ được trình bày ở trên sử dụng phương pháp phân tích tĩnh (static anal- ysis) để kiểm tra mã nguồn. Dễ nhận thấy, cách tiếp cận của phương pháp này là theo dõi dòng chảy của dữ liệu bị tác động (tainted data) từ các “nguồn” (source) mà dữ liệu được nhận vào tới “đích” (sink) - câu lệnh hoặc biểu thức mà kẻ tấn công nhắm đến. Ngoài phân tích tĩnh, nhiều nghiên cứu cũng đề cập tới việc sử dụng phân tích động (dynamic analysis). Phương pháp phân tích động là việc kiểm tra và đánh giá chương trình bằng cách thực thi chương trình và kiểm tra dữ liệu trong thời gian thực. Mục tiêu là để tìm lỗi trong một chương trình khi nó đang chạy, thay vì chỉ thuần túy kiểm tra mã nguồn. Tuy nhiên, các kỹ thuật dựa trên phân tích động như kiểm tra mô hình [19] và thực thi đồng thời [20] thường phức tạp và tốn kém.