Tuy nhiên, do sự đa dạng trong hình thức tấn công, các mẫu độc hại có thể xuất hiện tại bất cứ vị trí nào trong các gói tin, bài toán đặt ra là cần có một giải pháp có khả năng thâm nhập
Trang 1ĐẠI HỌC QUỐC GIA THÀNH PHỐ HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA KHOA HỌC & KỸ THUẬT MÁY TÍNH
BÁO CÁO TỔNG KẾT KẾT QUẢ ĐỀ TÀI KH-CN CẤP TRƯỜNG
Trang 2Danh sách cán bộ tham gia thực hiện đề tài
3 KS Nguyễn Hòa Hưng
- Bộ môn Kỹ Thuật Máy Tính – Khoa KH&KT MT – Đại học Bách Khoa Thành phố Hồ Chí Minh
Trang 3Mục lục
Chương 1 GIỚI THIỆU ĐỀ TÀI 1
1.1 Tính cấp thiết của đề tài 1
1.2 Đối tượng và mục tiêu nghiên cứu của đề tài 2
1.3 Tình hình nghiên cứu của đề tài 2
1.4 Hệ thống NIDS trên chip FPGA 4
Chương 2 TỔNG QUAN HỆ THỐNG NIDS VÀ BIỂU THỨC CHÍNH QUY 5
2.1 Hệ thống phát hiện xâm nhập mạng (NIDS): 5
2.1.1 Giới thiệu hệ thống NIDS 5
2.1.2 Phần mềm phát hiện xâm nhập mạng SNORT 5
2.2 Biểu thức chính quy 6
2.2.1 Giới thiệu biểu thức chính quy 6
2.2.2 Biểu thức chính quy dựa trên ngôn ngữ Perl (PCRE) 7
2.3 Các phương pháp xử lý biểu thức chính quy 7
2.3.1 Dùng NFA để biểu diễn biểu thức chính quy 9
Chương 3 THIẾT KẾ PHẦN CỨNG 12
3.1 Kiến trúc tổng thể hệ thống 12
3.2 Giới thiệu các module chính của hệ thống 13
3.2.1 Module giao tiếp đầu 13
3.2.2 Module Detect Engine 14
3.2.3 Module giao tiếp cuối (PostInterface) 19
Chương 4 THIẾT KẾ PHẦN MỀM 20
4.1 Mô tả phần mềm 20
4.2 Trích xuất PCRE 20
4.3 Định dạng PCRE và xây dựng cấu trúc cây cú pháp 22
Trang 44.3.1 Định dạng PCRE 22
4.3.2 Xây dựng cây cú pháp 22
4.4 Xây dựng cấu trúc NFA 23
4.5 Ánh xạ NFA sang mô hình ghép nối các khối logic 24
4.5.1 Xây dựng khối Start Block, State Block và End Block 24
4.5.2 Xây dựng khối CRB 25
4.5.3 Xây dựng khối BCCM 25
4.6 Tự động sinh code Verilog 26
Chương 5 HIỆN THỰC HỆ THỐNG 27
5.1 NetFPGA Platform 27
5.1.1 Giới thiệu NetFPGA 27
5.1.2 Cấu trúc project trong NetFPGA 28
5.2 Kết quả hiện thực hệ thống 28
5.2.1 Kết quả tổng hợp 28
5.2.2 Thiết lập môi trường thử nghiệm 30
5.2.3 Kết quả thử nghiệm 31
5.3 So sánh với các kiến trúc so trùng khác 33
Chương 6 TỔNG KẾT 35
6.1 Kết quả đạt được 35
6.2 Hướng phát triển 36
6.3 Công trình công bố liên quan 36
TÀI LIỆU THAM KHẢO 37
PHỤ LỤC 39
A Các mở rộng của tập PCRE 39
B Thống kê tập luật của phần mềm phát hiện xâm nhập mạng SNORT 41
Trang 5Mục lục hình
Hình 1-1 Mô hình hệt hống NIDS trên phần cứng FPGA 4
Hình 2-1 Vị trí hệ thống NIDS trong môi trường mạng 5
Hình 2-2 Mô hình tổng quan kiến trúc SNORT 5
Hình 2-3 Một luật của SNORT 6
Hình 2-4 Một máy trạng thái chấp nhận chuỗi „nice‟ 8
Hình 2-5 DFA chấp nhận tất cả các chuỗi bit chứa ít nhất 2 bit 1 8
Hình 2-6 NFA chấp nhận các chuỗi bit kết thúc bởi 00 hay 0110 9
Hình 2-7 NFA chấp nhận một ký tự đơn 9
Hình 2-8 Kết nối hai biểu thức chính quy con 9
Hình 2-9 Luật luân phiên hai biểu thức chính quy 10
Hình 2-10 NFA biểu diễn * chấp nhận một chuỗi bất kỳ gồm cả chuỗi rỗng 10
Hình 2-11 NFA biểu diễn ? chấp nhận không hay chỉ một chuỗi đầu vào 10
Hình 2-12 NFA biểu diễn + chấp nhận một số dương chuỗi đầu vào 10
Hình 2-13 NFA biểu diễn ((a*b)(c|d)) được xây dựng theo các quy tắc cơ bản 11
Hình 3-1 Kiến trúc tổng quan máy so trùng biểu thức chính quy 12
Hình 3-2 Cấu trúc nhóm so trung biểu thức chính quy (REMG) 12
Hình 3-3 Cấu trúc của Module giao tiếp đầu 13
Hình 3-4 Định dạng một entry trong FIFO 13
Hình 3-5 Dạng sóng đầu ra của module giao tiếp đầu 14
Hình 3-6 Mô hình các khối logic cơ bản: a State Block; b Start Block; c End Block 15
Hình 3-7 Mô hình tổng quát khối “^(a|b)c*$” 16
Hình 3-8 Kiến trúc khối CRB cho thức chính quy “(ab+c){2,10}” 16
Hình 3-9 Khối CRB cho biểu thức chính quy “/(mip){2,10}/” 17
Hình 3-10 BlockMemory chia sẻ giữa PCRE #1: “/ab /” và PCRE #2: “/a[^ab]/” 18
Hình 3-11 Cấu trúc của Module giao tiếp cuối 19
Hình 4-1 Lược đồ hoạt động của công cụ phần mềm 20
Hình 4-2 Cây cú pháp cho PCRE: “/a*[xyz](c|d)*(mip){2,10}\x3F/” sinh ra từ công cụ 23
Hình 4-3 Cấu trúc NFA sinh ra từ cây cú pháp (a) và sau khi thực hiện rút gọn (b) 23
Trang 6Hình 4-4 Sơ đồ giải thuật thực hiện việc ghép nối các khối logic 24
Hình 4-5 Các bước xây dựng SubRegex Unit và CouCom Unit từ chuỗi "/mip/,2,10" 25
Hình 5-1 Board NetFPGA nhìn trực diện 27
Hình 5-2 Môi trường kiểm nghiệm hệ thống 30
Hình 5-3 Môi trường kiểm nghiệm hệ thống 31
Hình 5-4 Biểu đồ tỷ lệ mất gói ứng với dữ liệu tấn công gói ngắn(200 ~ 400 bytes/packet) 32 Hình 5-5 Biểu đồ tỷ lệ mất gói với dữ liệu tấn công gói dài (1200 ~ 1400 bytes/packet) 32
Trang 7Mục lục bảng
Bảng 3.1 Các toán tử và các khối logic hiện thực tương ứng 14
Bảng 3.2 Các thông số trong module đếm và so sánh 17
Bảng 4.1 Bảng mô tả các toán tử PCRE được hỗ trợ 21
Bảng 5.1 Kết quả phân tích và xây dựng bằng phần mềm 29
Bảng 5.2 Thống kê kết quả tổng hợp trên ISE 10.1 29
Bảng 5.3 Bảng so sánh độ hiệu quả của các kiến trúc so trùng biểu thức chính quy khác nhau 34
Trang 8Chương 1 GIỚI THIỆU ĐỀ TÀI
1.1 Tính cấp thiết của đề tài
- Trong thời đại ngày nay, mạng máy tính đã phát triển với quy mô rất rộng trên toàn thế giới và với tốc độ ngày càng nhanh Đi kèm với sự phát triển đó là sự đa dạng về các phương pháp tấn công trên mạng Chẳng hạn như virus, spam, malwares, cũng như các hành vi độc hại khác Không những thế các loại tấn công này ngày một nguy hiểm, tinh vi hơn và các hậu quả do chúng gây ra ngày càng nghiêm trọng hơn Do đó, các phương pháp phòng chống là cần thiết hơn bao giờ hết
- Có nhiều phương pháp được triển khai áp dụng như các hệ thống mã hóa, tường lửa (firewall), anti-virus Tuy nhiên, do sự đa dạng trong hình thức tấn công, các mẫu độc hại
có thể xuất hiện tại bất cứ vị trí nào trong các gói tin, bài toán đặt ra là cần có một giải pháp có khả năng thâm nhập sâu vào toàn bộ nội dung của gói tin và so sánh với các dấu hiệu tấn công nằm trong một cơ sở dữ liệu được chọn lọc, tập hợp sẵn, để có thể báo động được các loại tấn công một cách chính xác và hiệu quả hơn Từ đó nảy sinh ra nhu cầu sử dụng hệ thống phát hiện xâm nhập mạng NIDS (Network Intrusion Detection System)
- Do quy mô mạng ngày càng lớn, tốc độ mạng máy tính hiện nay đã lên tới hàng chục Gbps và sẽ còn cao hơn nữa trong tương lai Do đó giải pháp NIDS trên phần mềm chỉ đạt được tốc độ vài trăm Mbps sẽ không thể xử lý và đáp ứng kịp tốc độ truyền dữ liệu Thêm vào đó, các giải pháp phần mềm không thể hoạt động hiệu quả với số lượng các luật và yêu cầu về tài nguyên bộ nhớ có thể sẽ rất lớn Vì vậy các giải pháp phần cứng (hardware) cho bài toán này là cần thiết và tất yếu Với các đặc điểm thuận lợi thuộc về bản chất của mình thì việc hiện thực NIDS trên phần cứng đang là một lĩnh vực nghiên cứu ứng dụng rất mới mẻ và có nhiều tiềm năng phát triển trên thế giới
- Do tính linh hoạt và mạnh mẽ trong khả năng biểu diễn các dạng tấn công, mã độc, các hệ thống NIDS mã nguồn mở chẳng hạn như SNORT và Bro tận dụng các biểu thức chính quy để biểu diễn các mẩu tấn công trong tập dữ liệu của mình Biểu thức chính quy cũng trở thành sự lựa chọn của các sản phẩm NIDS thương mại, chẳng hạn TippingPoint X505 của hãng 3Com, một số thiết bị an ninh mạng của Cisco như Cisco IDS 4250, 4235 Bên cạnh đó, không chỉ giới hạn trong ứng dụng NIDS, các biểu thức chính quy còn được dùng trong các chương trình diệt virus (clamav), các bộ lọc tầng 7 hệ thống, được tích hợp sẵn trong môi trường dòng lệnh và ứng dụng của các hệ điều hành Linux, …
- Mặc dù đã có nhiều cải tiến cho các phương pháp và giải thuật so trùng biểu thức chính quy trên phần mềm Tuy nhiên vơi sự gia tăng nhanh chóng về số lượng và độ phức tạp của các biểu thức chính quy cũng như yêu cầu ngày càng cao trong việc đáp ứng tốc độ
Trang 9đường truyền mạng lên đến hàng Gigabit/s, việc giải quyết bài toán biểu thức chính quy trên các các bộ xử lý phục vụ mục đích chung (General Purpose Processor) tỏ ra không hiệu quả Các nghiên cứu gần đây bắt đầu tập trung vào việc xử lý các biểu thức chính quy trên các phần cứng khả lập trình (FPGA, ASIC, PLD,… )
- Chip khả lập trình FPGA (Field Programable Gate Array) có hai ưu điểm quan trọng là khả năng tái lập trình và khả năng xử lý song song Do bản chất của bài toán tìm kiếm các mẫu tấn công vốn có sự thay đổi và cập nhật thường xuyên, khả năng tái lập trình cho phép giảm đáng kể chi phí để triển khai hệ thống Bên cạnh đó với việc cho phép hiện thực các mạch logic có khả năng hoạt động một cách độc lập ở tốc độ cao, việc đáp ứng yêu cầu tốc độ lên đến hàng Gbps là hoàn toàn khả thi
- Với những ly do trên nhóm quyết định thực hiện đề tài này với mục tiêu xây dựng một hệ thống xử lý các mẫu tấn công dựa trên biểu thức chính quy phục vụ cho hệ thống an ninh phát hiện xâm nhập mạng Hệ thống sẽ được triển khai trên chip khả lập trình FPGA và cần phải đảm bảo các yêu cầu về độ tin cậy, tính khả mở và tốc độ cao
1.2 Đối tượng và mục tiêu nghiên cứu của đề tài
- Nghiên cứu khả năng hiện thực hệ thống so trùng biểu thức chính quy cho hệ thống an ninh mạng và củ thể ở đây là hệ thống phát hiện xâm nhập mạng
- Nghiên cứu các giải thuật so trùng biểu thức chính quy đã và đang được sử dụng từ đó lựa chọn ra giải thuật phù hợp để có thể triển khai trên phần cứng khả lập trình FPGA
- Áp dụng giải thuật vào bài toán cụ thể là tập luật biểu thức chính quy PCRE của chương trình phát hiện xâm nhập mã nguồn mở Snort từ đó tiến hành cải tiến, tối ưu giải thuật và triển khai thệ thống trên chip FPGA.Hệ thống phải khả mở, có khả năng triển khai và ứng dụng thực tế đạt tốc độ cao
- Do tính cập nhật liên tục của các tập mã độc, đề tài cũng nhắm đến việc xây dựng một công cụ tự động (software tool chain) cho phép dễ dàng cập nhật và triển khai hệ thống
1.3 Tình hình nghiên cứu của đề tài
Trên thế giới việc hiện thực so trùng biểu thức chính quy trên phần cứng đã và đang được nghiên cứu khá rộng rãi Một trong những cách hiện thực hữu hiệu nhất trên các thiết bị FPGAs
là sử dụng mô hình máy trạng thái hữu hạn FSM (Finite State Machine) Việc triển khai trên FSM được chia thành hai cách tiếp cận chính là máy trạng thái đơn định Deterministic Finite Automata (DFA) và máy trạng thái không đơn định (Non-deterministic Finite Automata)
Năm 1982, Floyd và Ullman lần đầu tiên đưa ra mô hình NFA hiện thực trên các mảng logic khả lập trình PLAs (Programmable Logic Arrays) [2] làm nền tảng cho các phương pháp hiện thực sau này Họ chỉ ra rằng khi chuyển đổi trực tiếp từ NFA sang mạch tích hợp IC (Integrated Circuit), một máy N trạng thái cần không quá O(N) diện tích mạch Năm 2001, Sidhu và Prasanna đề xuất các khối logic hiện thực NFA cơ bản cho các toán tử Concatenation (.) ,
Trang 10Kleene-Star (*), Union (|) trên FPGAs [3] Clark và Schimmel sử dụng giải pháp pre-decoding
để chia sẻ bộ so sánh ký tự (character comparator) và do đó đã giảm được khá nhiều tài nguyên phần cứng [4] Hai phương pháp này trở thành nguyên mẫu cho nhiều nghiên cứu sau này [5],[6],[7]
Năm 2008, Yang [8] đưa ra một kiến trúc mới cho việc biểu diễn NFA trên chip FPGA Trong kiến trúc này các flipflop được đặt sau các mạch logic thay vì đặt trước như của Sidhu và Prasanna Nhờ đó thời gian so trùng ký tự có thể overlap lên thời gian chuyển trạng thái và kết quả là mạch đồng bộ được sinh ra sẽ có thể hoạt động ở tần số cao hơn
So với phương pháp NFA, thì các nghiên cứu cho phương pháp DFA ít được quan tâm hơn Năm 2003, Moscola [9] sử dụng DFA để xử lý một số phần của biểu thức chính quy Thiết kế của họ được hiện thực trên hệ thống FPX (Field programmable Port Extender) Họ hiện thực 21 biểu thức chính quy và đạt được tốc độ 1.18Gbps Kumar [10] đưa ra một số chỉnh sửa cho phương pháp DFA truyền thống và đề xuất mô hình DFA với độ trễ ngõ nhập (Delayed Input DFA – D2FA) Với thiết kế này họ đã giảm được đáng kể số lượng trạng thái yêu cầu của DFA Gần đây, nhóm nghiên cứu của học viện Kyushu [11] giới thiệu một thiết kế dạng lai ghép kết hợp giữa NFA và DFA Họ sử dụng mô hình kiến trúc DFA để xử lý các chuỗi kí tự liên tục
và các ký tự độc lập trong biểu thức chính quy, trong khi đó tận dụng các thanh ghi dịch và các kiến trúc NFA để xử lý các toán tử phức tạp
Đối với việc áp dụng cho bài toán của các biểu thức chính quy dựa theo cú pháp PERL (PCRE) Năm 2007, trong bài báo [12], Abhishek Mitra và các đồng sự đưa ra một phương pháp hiện thực NFA trên phần cứng bằng cách chuyển đổi các PCRE (Perl-Compatible Regular Expression – loại biểu thức chính qui tương thích với ngôn ngữ Perl) opcodes được tạo ra bởi trình biên dịch PCRE từ tập luật của SNORT thành ngôn ngữ VHDL, tương tự cách hoạt động của cỗ máy PCRE dựa trên phần mềm
Bài báo [5] đưa ra tất cả các khối PCRE cơ bản phục vụ cho việc xây dựng một cấu trúc NFA phân cấp, đồng thời cũng đề nghị phương pháp hiện thực cho các khối lặp bắt buộc Trong
[13], Cheng-Hung Lin cùng nhóm nghiên cứu của mình đưa ra ý tưởng chia sẻ các prefix, infix
và suffix Các NFA có các infix và suffix chung nhiều nhất sẽ được gom lại một nhóm Tuy nhiên, giải pháp này không được ứng dụng trong các nghiên cứu sau này Năm 2007, [1] Christopher áp dụng D2FA cho tập mẫu PCRE , bằng việc áp ụng thiết kế pipline và việc nhân lên nhiều mạch logic để so trùng hệ thống của ông đạt được tốc độ lên đến 10Gbps Tuy nhiên phương pháp này chỉ áp dụng được cho một số lượng nhỏ các PCRE
Trong nước, tính tới thời điểm thực hiện đề tài, vẫn chưa có công bố khoa học chính thức của các nhóm khác về đề tài nghiên cứu này
Trang 111.4 Hệ thống NIDS trên chip FPGA
Hình 1.1 mô tả các thành phần chủ yếu của hệ thống NIDS trên chip FPGA Các gói tin đến
hệ thống sẽ được đưa qua một FIFO đệm, module Packet Collecter sẽ đọc nội dung của FIFO và truyền cho module Packet Decoder Packet Decoder phân tách các trường Header và Payload của gói tin gửi cho các module xử lý tương ứng Kết quả xử lý sẽ được tổng hợp lại bởi module Management
Packet Classification (Header Processing)
Packet Decoder Packet
Collector Management
Hình 1-1 Mô hình hệt hống NIDS trên phần cứng FPGA
Trong mô hình này hệ thống xử lý biểu thức chính quy thực hiện việc tìm kếm trong payload của gói tin các dấu hiệu tấn công, mã độc từ đó đưa ra cảnh báo kịp thời Hiện thực module so trùng nội dung gói tin biểu diễn bằng biểu thức chính quy tận dụng cơ chế xử lý song song của các thiết bị phần cứng là một trong những giải pháp góp phần nâng cao hiệu suất của toàn bộ hệ thống phát hiện xâm nhập mạng
Trang 12Chương 2 TỔNG QUAN HỆ THỐNG NIDS VÀ BIỂU THỨC CHÍNH QUY
2.1 Hệ thống phát hiện xâm nhập mạng (NIDS):
2.1.1 Giới thiệu hệ thống NIDS
Hệ thống Phát hiê ̣n xâm nhâ ̣p mạng (Network Intrusion Detection System – NIDS) được triển khai rộng rãi như một giải pháp an ninh cho các hệ thống mạng trong thực tế NIDS có thể kiểm tra vào sâu bên trong gói dữ liệu để so sánh nội dung gói dữ liệu với các dấu hiệu tấn công nằm trong một cơ sở dữ liệu được chọn lọc và tập hợp sẵn Từ đó có thể báo động kịp thời cho ngươi quản trị để họ có thể thực hiện các biện pháp xử lý phù hợp NIDS có thể triển khai trên cả
hệ thống phần mềm lẫn phần cứng Hình 2.1 mô tả một ví dụ triển khai hệ thống NIDS đơn giản
Dữ liệu mạng truyền nhận với môi trường bên ngoài được sao chép và chuyển cho hệ thống NIDS xử lý
Malicios Database
Hình 2-2 Mô hình tổng quan kiến trúc SNORT
Trang 13Hình 2.2 mô tả tổng quan kiến trúc của SNORT, theo đó SNORT sẽ bao gồm 4 phần chính:
Packet sniffer: Thực hiện nhiệm vụ bắt tất cả gói tin từ môi trường mạng để đưa vào xử
lý
Preprocessor: Thực hiện các thao tác xử lý ban đầu như tập hợp các gói tin bị phân
mảnh, định dạng nội dung…
Detection Engine: Trực tiếp so trùng nội dung gói tin với các tập luật có sẵn để phát hiện
ra các nội dung nguy hiểm
Alert and Logging Component: Nối nội dung gói tin phù hợp với luật, tùy theo cấu
hình gói tin có thể bị log lại hoặc đưa ra các cảnh báo đến quản trị viên
Để có thể nhận biết các loại tấn công cũng như làm cơ sở để đưa ra các cảnh báo tương ứng đối với lưu lượng gói tin, SNORT đòi hỏi một cơ sở dữ liệu là các luật (rule) Các tập rule mô tả các dấu hiệu tấn công đã biết trước trong quá khứ được dùng để nhận biết các tấn công có cùng dạng tại thời điểm đang xét Các luật được phân loại thành từng file riêng biệt có tên mở rộng là
.rules và được lưu trữ trong thư mục rules của SNORT
Luật của SNORT được định nghĩa dạng text (mã ASCII) có cấu trúc rõ ràng và cú pháp đơn giản Mỗi luật là sự kết hợp của hai phần: Rule Header và Rule Content Trong khi Rule Header cung cấp thông tin liên quan thuộc trường Header của gói tin, Rule Content bao gồm một loạt các tùy chọn được viết liền nhau, cung cấp thông tin cần kiểm tra trong phần thân của gói tin Ở hình 2.3 mô tả ví dụ một luật trong tập IMAP của SNORT, luật này có nhiệm vụ phát hiện ra tất
cả các kết nối có khả năng đang tấn công vào lỗ hổng buffer overflow trên IMAP server Phần in
đậm là phần Rule Header, phần còn lại trong dấu ngoặc đơn là Rule Content
2.2 Biểu thức chính quy
2.2.1 Giới thiệu biểu thức chính quy
Biểu thức chính quy, thường được gọi thông qua từ RegEx (Regular Expression) là một cách ghi chú súc tích để diễn tả một tập các chuỗi mà không cần thiết phải liệt kê tất cả các thành phần của tập đó Biểu thức chính quy thực chất là một dạng ngôn ngữ hình thức với cú pháp được quy định cụ thể và dựa trên hai dạng ký tự: các ký tự thông thường (bảng chữ cái, chữ số, ký tự trong bảng mã ASCII,…) và các siêu ký tự (hay còn gọi là các toán tử)
alert tcp $EXTERNAL_NET any -> $HOME_NET 143(msg:"IMAP create buffer overflow
attempt"; flow:to_server,established; content:"CREATE"; isdataat:1024,relative; PCRE:"/\sCREATE\s[^\n]{1024}/smi"; metadata:service imap; reference:bugtraq,7446; classtype:misc-attack; sid:2107; rev:5;)
Hình 2-3 Một luật của SNORT
Trang 14Biểu thức chính quy được đặc trưng bởi 3 dạng toán tử chính là : toán tự gộp, toán tử lựa chọn (|), và toán tử lượng tử (*,?,+)
Toán tử gộp được sử dụng để kết hợp các biểu thức chính quy rời rac thành một biểu
thức chính quy mới liên tục Ví dụ: Nếu r 1 so trùng s 1 và r 2 so trùng chuỗi s 2 , thì r 1 r 2 sẽ
nghĩa qua một ví dụ sau
Một số ví dụ:
Biểu thức ab|cd so trùng chuỗi „ab‟, „cd‟
Biều thức ab* so trùng chuỗi con „a‟, „ab‟, „abb‟, „abbb‟, „abbb b‟
Biểu thức ab+ so trùng chuỗi con „ab‟, „abbb‟, „abb…bb‟ không so trùng „a‟
Biểu thức ab? chỉ so trùng „a‟ và „ab‟
Ngoài ra các biểu thức chính quy còn có thể được gom nhóm lại trong trường hợp muốn làm
tăng độ ưu tiên bằng cặp dấu đóng mở ngoặc „( )‟ Chẳng hạn x(a?|b*)y chỉ so trùng xay, xy, xby,
xbby, xbb…by
2.2.2 Biểu thức chính quy dựa trên ngôn ngữ Perl (PCRE)
PCRE (Perl Compatible Regular Expressions) là một dạng biẻu thức chính quy được viết theo cú pháp của ngôn ngữ Perl PCRE thật sự mạnh mẽ và linh hoạt hơn rất nhiều so với biểu thức chính quy truyền thống, do đó được sử dụng để biểu diễn các dạng tấn công phức tạp có tính biến đổi trong tập luật của SNORT Trong Snort, các mẫu đọc hại có thể được mô tả thông
qua từ khóa pcre như ví dụ hình 2.3
Bên cạnh những toán tử truyền thống trong biều thức chính quy, PCRE bổ sung thêm một số toán tử khác từ đó tăng tính linh hoạt trong việc định nghĩa các chuỗi ký tự Một số mở rộng của PCRE bao gồm: các toán tử neo (anchor), các cờ (flag), các lớp ký tự đặc trưng (character class), toán tử lặp ràng buộc (constraint repetition), dãy ký tự thoát (escape sequence) và toán tử tham chiếu ngược (backreference)
Chi tiết các mở rộng trong PCRE có thể tham khảo thêm phần phụ lục
2.3 Các phương pháp xử lý biểu thức chính quy
Các phương pháp để xử lý biểu thức chính quy trên phần cứng chủ yếu tập trung vào việc sử dụng mô hình máy trạng thái hữu hạn (Finite State Machine – FSM) bởi độ hiệu quả và khả năng
Trang 15hỗ trợ những toán tử phức tạp của nó FSM là một mô hình bao gồm một số lượng hữu hạn các trạng thái, sự chuyển trạng thái giữa những chúng tương tự như một lưu đồ mô tả một hành động khi điều kiện đầu vào được thỏa Hoạt động của FSM có thể được mô tả như sau FSM xuất phát
tại một trạng thái (gọi là trạng thái bắt đầu start state), đi qua các trạng thái chuyển tiếp dựa vào
các input đầu vào trước khi kết thúc tại một trạng thái nào đó Trong FSM chỉ có một trạng thái
nào đấy được đánh dấu là kết thúc thành công của hoạt động (gọi là accept state) Nếu một FSM
biểu diễn một chuỗi, ta nói FSM chấp nhận chuỗi đó
Hình 2-4 Một máy trạng thái chấp nhận chuỗi „nice‟
FSM cung cấp hai cách tiếp cận là máy trạng thái hữu hạn đơn định (Deterministic Finite Automata – DFA) và máy trạng thái hữu hạn không đơn định (Non-deterministic Finite Automata) Điểm khác biệt chính giữa hai cách tiếp cận của máy trạng thái hữu hạn nằm ở chỗ hàm chuyển trạng thái của chúng Hàm chuyển trạng thái của DFA trả về một kết quả là một trạng thái đơn kế tiếp, trong khi hàm có chức năng tương tự ở NFA trả về một tập các trạng thái,
và có thể là một tập rỗng Do đó, trong khi NFA cho phép nhiều hơn một trạng thái cùng tích cực tại một thời điểm, DFA chỉ cho phép một trạng thái được tích cực Do đó, thời gian chuyển trạng thái của DFA ít hơn so với NFA và thích hợp với các giải pháp phần mềm Việc xử lý PCRE trong Snort cũng dựa trên các giải thuật DFA Hình 2.5, 2.6 là các ví dụ cho hai mô hình máy trạng thái
Hình 2-5 DFA chấp nhận tất cả các chuỗi bit chứa ít nhất 2 bit 1
Trang 16Hình 2-6 NFA chấp nhận các chuỗi bit kết thúc bởi 00 hay 0110
Tuy nhiên phương pháp DFA lại có khả năng gây ra bùng nổ số trạng thái khi được dung để biểu diễn các biểu thức chính quy Với một NFA n trạng thái thì DFA tương đương có thể phải cần 2^n trạng thái Điều này khiến cho việc sử dụng DFA trên cho các giải pháp phần cúng và đặc biệt là FPGA trở lên khó khăn Hơn nữa, đối với FPGA, do có khả năng sử lý song song kết hợp nhiều mạch logic, việc nhiều trạng thái đồng thời tich cực của NFA có thể dễ dàng được giải quyết Từ những nhận xét này, nhóm đi dến quyết định áp dụng mô hình NFA để giải quyết bài toán so trùng biểu thức chính quy
2.3.1 Dùng NFA để biểu diễn biểu thức chính quy
Một NFA biểu diễn một biểu thức chính quy có thể được xây dựng bằng cách sử sụng các nguyên tắc cơ bản
Nguyên tắc thứ nhất là xem mỗi phần nhỏ của biểu thức chính quy, bản thân là một biểu thức chính quy Do đó, ta áp dụng các nguyên tắc khác để tạo nên một biểu thức lớn hơn Một NFA đơn giản nhất là NFA chấp nhận một ký tự đơn Các NFA lớn hơn sẽ chứa đựng ít nhất một hay nhiều NFA nguyên tử này Hình 2.7 mô tả NFA nguyên tử với một trạng thái bắt đầu và một trạng thái kết thúc
Hình 2-7 NFA chấp nhận một ký tự đơn
Nguyên tắc thứ hai: để kết nối hai biểu thức chính quy ta sử dụng luật trong hình bên dưới Trong đó, mỗi hình chữ nhật nét đứt biểu diễn một NFA biểu diễn một biểu thức chính quy con
Hình 2-8 Kết nối hai biểu thức chính quy con
Trang 17 Nguyên tắc thứ ba: biểu diễn toán tử | để luân phiên hai biểu thức chính quy theo hình 2.9
Hình 2-9 Luật luân phiên hai biểu thức chính quy
Nguyên tắc thứ tư: các toán tử lượng tử của biểu thức chính quy (*,?,+) được biểu diễn lần lượt theo các hình bên dưới dựa theo chức năng của toán tử
Hình 2-10 NFA biểu diễn * chấp nhận một chuỗi bất kỳ gồm cả chuỗi rỗng
Hình 2-11 NFA biểu diễn ? chấp nhận không hay chỉ một chuỗi đầu vào
Hình 2-12 NFA biểu diễn + chấp nhận một số dương chuỗi đầu vào
Bằng cách kết hợp các quy tắc đi từ cơ bản được trình bày trong phần này, hoàn toàn có thể xây dựng một NFA biểu diễn một biều thức chính quy phức tạp hơn Ta xét một ví dụ xây
dựng NFA từ biểu thức chính quy sau ((a*b)(c|d)).Trước tiên, ta xây dựng NFA chấp ký tự a
Sau đó áp dụng quy tắc thứ tư cho toán tử * ta xây dựng NFA cho a* và NFA này được kết nối với NFA chấp nhận b Song song với thao tác trên, ta xây dựng NFA chấp nhận c và d rùi luân
Trang 18phiên chúng bằng quy tắc thứ ba tạo thành NFA cho (c|d) Cuối cùng kết nối NFA (a*b) và NFA (c|d) ta được NFA kết quả mô tả ở hình 2.13
Hình 2-13 NFA biểu diễn ((a*b)(c|d)) được xây dựng theo các quy tắc cơ bản
Trang 19Chương 3 THIẾT KẾ PHẦN CỨNG
3.1 Kiến trúc tổng thể hệ thống
PreInterface buffer
Hình 3-1 Kiến trúc tổng quan máy so trùng biểu thức chính quy
Hình 3.1 trên mô tả tổng quan kiến trúc hệ thống so trùng biểu thức chính quy hiện thực trên chip FPGA Hệ thống bao gồm ba module chính: hai module giao tiếp đầu (PreInterface) và giao tiếp cuối (PosInterface) có chức năng chính là đảm bảo việc bắt tay và đồng bộ dữ liệu với các Module khác trong cùng hệ thống phát hiện xâm nhập mạng xâm nhập mạng Module máy so trùng (DetectEngine) là module trung tâm thực hiện việc tìm kiếm mẫu xâm nhập mạng trong nội dung payload của gói tin
REME n REME 2
r e g i s t e r s
1
BB
REME 1
101101 100001 110011
a b c
Hình 3-2 Cấu trúc nhóm so trung biểu thức chính quy (REMG)
Module Detect Engine được phân ra thành các nhóm so trùng biểu thức chính quy (Regular Expression Matching Group – REMG), mỗi nhóm bao gồm một tập các biểu thức chính quy được phân hoạch và chia sẻ chung một tập ký tự chuyển trạng thái Cấu trúc của một REMG được mô tả như trong hình 3.2 bao gồm một khối so trùng kí tự tập trụng dựa trên BlockRam (BlockRam Centralized Character Matching Module – BCCM) và các máy so trùng biểu thức
Trang 20chính quy (Regular Expression Matching Engine – REME) Ở đây mỗi REME tương ứng với một biểu thức chính quy cụ thể và được xây dựng dựa trên mô hình máy trạng thái không đơn định Khi có byte ký tự mới đi vào hệ thống, module BCCM sẽ thực hiện giải mã ký tự này thành các tín hiệu điều khiển và chuyển đến các REME tương ứng Mỗi REME sẽ dựa trên trạng thái hiện tại và tín hiệu chuyển trạng thái từ BCCM để chuyển đến trạng thái so trùng phù hợp
3.2 Giới thiệu các module chính của hệ thống
3.2.1 Module giao tiếp đầu
Module này nhận nhiệm vụ giao tiếp với các module khác của hệ thống chống xâm nhập mạng mà cụ thể module phân tách payload và header của gói tin đến Mỗi khi nhận một gói tin
từ đường mạng, module phân tách sẽ tách header ra khỏi gói tin và chỉ gửi payload cho hệ thống
so trùng biểu thức chính quy Module PreInterface bao gồm 2 phần chính: máy trạng thái và một FIFO giao tiếp được minh họa qua hình 3.3
Hình 3-3 Cấu trúc của Module giao tiếp đầu
Hình 3-4 Định dạng một entry trong FIFO
Cứ mỗi cạnh lên của xung clock, mỗi byte thô từ phần payload sẽ được nối thêm 3 bit điều khiển để tạo thành dữ liệu 11 bit và sau đó được module phân tách chuyển vào FIFO giao tiếp
bên trong PreInterface Như đã mô tả trong hình 3.4 có 3 tín hiệu điều khiển: Sod, En, Eod được nối sau 7 bit dữ liệu thực của gói tin Trong khi, Sod biểu diễn tín hiệu bắt đầu gói tin (start of
data) được tích cực ngay thời điểm gói tin mới vào hệ thống, Eod mô tả tín hiệu kết thúc gói tin (end of data) báo hiệu đây là byte cuối cùng của gói tin cũ Cuối cùng, tín hiệu En (enable) cho
phép đưa hệ thống vào trạng thái chờ
Nếu FIFO không rỗng, dữ liệu sẽ được đọc từ FIFO và các tín hiệu điều khiển sẽ được rút trích và truyền đi độc lập với dữ liệu thực của payload gói tin đến module so trùng biểu thức
Trang 21chính quy Hình 3.5 mô tả dạng sóng đầu ra của module giao tiếp đầu Sóng này sẽ được truyền
đến mạch so trùng biểu thức chính quy để xử lý Qua dạng sóng ta thấy tín hiệu Sod được tích
cực trong 2 chu kỳ clock, chu kỳ sau gối đầu lên byte dữ liệu hợp lệ đầu tiên Tín hiệu tích cực ở chu kỳ đầu dùng để reset ngõ ra của toàn bộ các máy so trùng một luật đơn trong hệ thống
Trong khi đó, chu kỳ sau đảm bảo cho việc so trùng các biểu thức chính quy có toán tử „^‟ hoạt động đúng chức năng Tín hiệu En tích cực trong suốt những byte hợp lệ của dữ liệu Khi byte
dữ liệu hợp lệ cuối cùng được truyền đi, Eod sẽ được tích cực trong khoảng 1 xung clock sau 2
chu kỳ tiếp theo
Hình 3-5 Dạng sóng đầu ra của module giao tiếp đầu
BCCM [] Character Class
[^] Neg-Character Class r{n,m} Constraint Repetition CRB
Bảng 3.1 Các toán tử và các khối logic hiện thực tương ứng
3.2.2 Module Detect Engine
Kiến trúc của module Detect Engine dựa trên sự kết hợp của năm khối logic cơ bản Bảng 3.1 mô tả các toán tử và các khối logic tương ứng để hiện thực các toán tử đó
Trang 223.2.2.1 State Block – Start Block – End Block
Khối State Block có thể xem như tương đương một trạng thái NFA cơ bản Khi này kí tự
chuyển trạng thái được xác định qua tín hiệu char, các trạng thái liền trước được sẽ kết nối thông qua các tín hiệu in như hình 3.6.a Khi một trạng thái được active, tương đương với giá trị Q của
Flipflop bên trong State block tích cực mức cao, điều này chỉ xảy ra khi một trong các trạng thái liền trước nó đang được tích cực và kí tự đến hệ thống phù hợp với kí tự chuyển trạng thái của
nó Cấu trúc của State Block bao gồm một cổng OR n ngõ nhập theo sau bởi một cổng AND hai ngõ nhập và một flipflop để chốt giá trị rất hiệu quả để hiện thực lên trên các thiết bị FPGA Với kiến trúc FPGA thông thường gồm 4 bit LUTs, một FlipFlop cho mỗi logic cell và 2 logic cells cho mỗi slice thì có thể dễ dàng map State Block lên trên một logic cell với n ≤ 3 hoặc 1 slice với
4 ≤ n ≤ 7
a
out Start Block
rst SoD
FF
FF State Block
c b
1
Hình 3-6 Mô hình các khối logic cơ bản: a State Block; b Start Block; c End Block
Khác với State Block, Start Block và End block được xây dựng với mục đích có thể xử lý được các toán tử neo (“^”, “$”) Các toán tử này đòi hỏi chuỗi cần tìm kiếm phải nằm tại vị trí bắt đầu hoặc kết thúc của gói tin Do đó, hai khối này cần thêm các tín hiệu điều khiển SoD (Start of Data), EoD (End of Data) để thông báo vị thời điểm bắt đầu và kết thúc của payload
Từ 3 khối logic cơ bản này có thể xây dựng được máy so trùng biểu thức chính quy cho hầu hết các PCRE đơn giản không chứa toán tử lặp bắt buộc Hình 3.7 mô tả cấu trúc của REME cho
biểu thức chính quy “^(a|b)c*$”
Trang 23Hình 3-7 Mô hình tổng quát khối “^(a|b)c*$”
3.2.2.2 Kiến trúc khối so trùng toán tử lặp ràng buộc
Ý tưởng chính của việc hiện thực khối so trùng toán tử lặp ràng buộc (Contraint Repetition Block – CRB) dựa trên cách tiếp cận của M Faezipour và M Nourani [14] là sử dụng một bộ đếm đồng bộ để kiểm soát số lần lặp lại của một mẫu cụ thể Cấu trúc của CRB bao gồm 3 bộ phận chính: bộ phận so trùng biểu thức chính quy con (SubRegex), bộ phận Reset, bộ phận đếm
và so sánh (CouCom) Trong đó SubRegEx có nhiệm vụ kiểm tra sự xuất hiện của mẫu trong dữ liệu đi vào hệ thống, Reset sẽ khởi tạo lại giá trị của bộ đếm, khi so trùng thất bại, còn CouCom
có nhiệm vụ đếm và so sánh số lần lặp lại của mẫu với giá trị được quy định trước
match
input
Hình 3-8 Kiến trúc khối CRB cho thức chính quy “(ab+c){2,10}”
Về cơ bản CRB có vai trò tương đương với một khối State Block bình thường CRB nhận vào tín hiệu tích cực từ các khối StateBlock hay CRB phía trước, thực hiện các bước chuyển trạng thái và so trùng sau đó lại gửi tín hiệu tích cực đến các khối StateBlock hoặc CRB tiếp theo SubRegex có cấu trúc tương tự như một máy so trùng biểu thức chính quy hoàn chỉnh, bao gồm nhiều trạng thái biểu diễn bằng các Block State được kết nối trực tiếp với nhau, và các kí tự chuyển trạng thái được lấy từ khối BCCM chung Cứ mỗi chu kỳ xung clock, Sub-Regex sẽ dựa vào các tín hiệu so trùng kí tự từ Bram Block mà thực hiện các bước chuyển trạng thái Mỗi khi SubRegex so trùng thành công, nó sẽ tích cực tín hiệu ngõ ra cho phép CouCom tăng biến đếm
Trang 24lên một đơn vị Ngược lại nếu việc so trùng thất bại bộ phận reset sẽ tích cực tín hiệu ngõ ra khởi tạo lại giá trị của biến đếm trong CouCom
Trong cú pháp của PCRE định nghĩa 4 loại toán tử lặp ràng buộc khác nhau và ứng với mỗi toán tử sẽ có một bộ CouCom tương ứng Các bộ CouCom này chia sẻ chung một mô hình kiến trúc như 3.9.a Trong mô hình này, các giá trị M,N,G có thể thay đổi trong lúc thiết kế để thu được cấu hình tương ứng Bảng 3.2 liệt kê các loại toán tử và các cấu hình Cấu trúc cụ thể của các bộ CouCom được mô tả trong hình 3.9.b,c,d
en
rst
lRst gRst
Trong mô hình State Block cơ bản mô tả bên trên, giá trị ngõ ra được quyết định bởi tín hiệu
chuyển trạng thái char từ mộ bộ so trùng ký tự tập trung Ở đây State Block không cần quan tâm
Trang 25kí tự chuyển trạng thái là một ký tự đơn, một lớp ký tự hay các biểu tượng đặc trưng, toàn bộ việc so trùng kí tự đầu vào được thực hiện bởi bộ BCCM
Module BCCM được hiện thực trên bộ nhớ onchip của FPGA (BlockMemory) có kiến trúc tổng quát được diễn tả qua hình 3.10 Việc so trùng ký tự đầu vào dựa vào việc truy xuất nội dung của BlockMemory BlockMemory được sử dụng là một khối nhớ bao gồm 256 entry với độ rộng mỗi entry phụ thuộc vào số ký tự khác nhau trong một tập PCRE cho trước Cứ mỗi chu kỳ xung clock, một ký tự trong nội dung của gói tin được đưa vào hệ thống Giá trị byte của ký tự được sử dụng như địa chỉ (index) để truy xuất nội dung của một entry trong BlockMemory Giá trị đọc ra từ BlockMemory là một bit vector ứng với giá trị so trùng của từng trạng thái trong mạch Các bit trong vector này sẽ được kết nối đến các trạng thái tương ứng Theo như mô tả, một máy n trạng thái so trùng một PCRE, ta chỉ cần sử dụng một khối nhớ không quá 256 x n bit Hơn thế, nếu hai trạng thái sử dụng cùng một tín hiệu đầu vào của kết quả so trùng một ký tự thì chúng sẽ chia sẻ một bit output của khối nhớ trên Tương tự, để tiết kiệm diện tích và tài nguyên phần cứng, khối nhớ sẽ được chia sẻ bởi nhiều PCRE có các trạng thái nhận ký tự so trùng như nhau
Để làm giảm fan-out cho ngõ ra của BlockMemory, cũng như không ảnh hưởng đến tần số clock và throughput của hệ thống, ở đây nhóm quyết định sử dụng nhiều BlockMemory Mỗi BlockMemory sẽ phục vụ một số lượng PCRE tối đa nhất định phụ thuộc vào chính sách gom nhóm các PCRE Nội dung của BlockMemory không bị thay đổi trong suốt quá trình hoạt động của hệ thống
Hình 3-10 BlockMemory chia sẻ giữa PCRE #1: “/ab /” và PCRE #2: “/a[^ab]/”