Mô hình B-FSM trong [4] có thêm tính năng chuyển bảng băm khi có sự xung đột, cho ra được kết quả với hiệu suất và hiệu quả sử dụng bộ nhớ cao.Tuy nhiên, với những cải tiến này, giải phá
GIỚI THIỆU
Tính cấp thiết của đề tài
Ngày nay, mạng máy tính bùng nổ trở thành một phần thiết yếu của cuộc sống hàng ngày cũng như trong công việc kinh doanh Theo thống kê thì số lượng người sử dụng Internet trên toàn thế giới đã tăng gấp đôi trong 5 năm qua và đã vượt qua mốc 2 tỷ trong năm 2010, với phần lớn trong số 226 triệu người dùng mới đến từ các nước đang phát triển
Song song với sự phát triển mạnh mẽ, Internet còn là phương tiện hữu hiệu để phát tán các virus máy tính Những virus mới được viết trong thời gian gần đây không còn thực hiện các trò đùa hay sự phá hoại đối máy tính của nạn nhân bị lây nhiễm nữa, mà đa phần hướng đến việc lấy cắp các thông tin cá nhân nhạy cảm (các mã số thẻ tín dụng) mở cửa sau cho tin tặc đột nhập chiếm quyền điều khiển hoặc các hành động khác nhằm có lợi cho người phát tán virus Kết quả là, an ninh thông tin, virus máy tính cụ thể hơn, đang trở thành một trong những vấn đề quan trọng nhất với người sử dụng Internet Vì vậy, chương trình chống virus là thành phần thiết yếu trong tất cả các giải pháp bảo mật
So trùng mẫu là quá trình xử lý chính trong các chương trình chống virus, kiểm tra sự xuất hiện của các mẫu virus được biết đến trong nội dung tập tin Điều này tốn một số lượng đáng kể thời gian cũng như tài nguyên hệ thống do số lượng ngày càng tăng của virus Bên cạnh đó, tốc độ của quá trình quét giảm khi số lượng mẫu tăng Đồng thời, hiệu suất của hệ thống mà chạy chương trình chống virus cũng bị ảnh hưởng
Mặc dù có nhiều lợi thế và cải tiến trong chương trình chống virus dựa trên phần mềm, nhưng kích thước và sự đa dạng của virus ngày càng tăng, việc đảm bảo độ ổn định và tính chính xác của hệ thống càng trở lên khó khăn hơ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
2 lợi của mình thì việc cải tiến các chương trình anti-virus trên phần cứng, đặc biệt là các thiết bị phần cứng khả lập trình (Field Programable Gate Array- FPGA) đ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.
Phát biểu vấn đề
ClamAV là phần mềm anti-virus, mã nguồn mở nổi tiếng nhất hiện nay trên hệ linux, và được sử dụng trong các công trình nghiên cứu Vì vậy, lựa chọn ClamAV để nghiên cứu cải tiến là thích hợp
Công trình nghiên cứu của Xin Zhou và các cộng sự [1], chứng tỏ rằng hầu hết thời gian trong giai đoạn quét virus chỉ đơn giản là so trùng mẫu (chiếm 73.4% thời gian quét) Trong đó, thời gian so trùng chuỗi động chiếm 25.9%, mặc dù số lượng mẫu động chỉ 3.3% trong tổng số mẫu Bên cạnh đó, tốc độ quét sẽ giảm khi số lượng các mẫu tăng lên Dẫn đến hiệu suất của các chương trình anti-virus bị ảnh hưởng
Vì vậy, đề tài luận văn tập trung vào bài toán so trùng mẫu động trên phần cứng nhằm giảm thời gian quét virus của phần mềm ClamAV Đây là một phần quan trọng đóng vai trò quyết định trong tốc độ và hiệu năng của ClamAV, và các chương trình anti- virus khác.
Đóng góp của luận văn
Luận văn chỉ ra được tính khả thi trong vấn đề tăng tốc độ trong các chương trình antivirus bằng cách sử dụng phần cứng và mở ra tiềm năng trong việc sử dụng các thiết bị FPGA
Những đóng góp chính của luận văn là:
Kiến trúc so trùng mẫu động, hỗ trợ các ký tự wildcard
Phương pháp phân tích, xử lý tập mẫu của ClamAV, tạo ra các file cấu hình cho phần cứng dựa vào lựa chọn của người dùng
Các kết quả nghiên cứu và thực nghiệm trong giai đoạn luận văn đã được công bố trong tạp chí khoa học công nghệ năm 2013 và kỷ yếu hội nghị quốc tế FDSE của Springer năm 2014.
Cấu trúc luận văn
Phần còn lại của luận văn có cấu trúc như sau:
Chương 2: Trình bày các kiến thức nền tảng liên quan đến đề tài, bao gồm các giải thuật so trùng mẫu và các kết quả nghiên cứu trước đây
Chương 3: Tổng quan về cơ sở dữ liệu mẫu ClamAV và kiến trúc so trùng mẫu động trên phần cứng
Chương 4: Trình bày thiết kế kiến trúc phần cứng của module so trùng mẫu động
Chương 5: Trình bày giải pháp, quy trình tổng hợp và phân tích mẫu, cho phép cập nhật và xây dựng nhanh chóng hệ thống
Chương 6: Đánh giá và kiểm nghiệm hệ thống trên board NetFPGA
Chương 7: Tổng kết các kết quả của luận văn và đề xuất hướng phát triển tiếp theo
KIẾN THỨC NỀN TẢNG
So trùng mẫu
So trùng mẫu là một trong những bài toán cơ bản và quan trọng của ngành máy tính Trong ngữ cảnh của luận văn, so trùng mẫu là tác vụ kiểm tra sự tồn tại của một hay nhiều chuỗi cho trước trong một chuỗi liên tục các ký tự Trong NIDS (hệ thống phát hiện xâm nhập mạng) và các ứng dụng antivirus, mỗi ký tự là một byte Mỗi chuỗi cho trước được gọi là một mẫu Một tập hợp các mẫu được gọi là một cơ sở dữ liệu Mỗi mẫu trong một cơ sở dữ liệu là duy nhất
Do sự phát triển và đa dạng của các virus siêu đa hình (polymorphic), một dạng virus máy tính có thể làm thay đổi diện mạo chữ ký của mình thông qua các kỹ thuật như mã hóa để tránh các phần mềm chống virus phát hiện, cho nên các mẫu virus trong các ứng dụng antivirus có thể chứa các biểu thức chính qui Các biểu thức chính qui cho phép các mẫu virus được mô tả tổng quát hơn nên làm giảm số lượng mẫu trong cơ sở dữ liệu
Giải thuật cho so trùng mẫu được chia thành hai loại: so trùng mẫu đơn (single pattern) và so trùng đa mẫu (multi pattern) Trong một lần tìm kiếm virus, so trùng mẫu đơn chỉ thực hiện so trùng với một mẫu duy nhất, trong khi so trùng đa mẫu phải tìm kiếm nhiều mẫu cùng lúc có mối quan hệ ràng buộc lẫn nhau Cả 2 loại thường đòi hỏi các mẫu phải được tiền xử lý, các thông tin phụ sau quá trình tiền xử lý được dùng để tăng tốc quá trình so sánh thực tế sau này Trong một số thuật toán chẳng hạn như Aho-
Corasick [2] toàn bộ tập mẫu phải được xử lý thành một cấu trúc dữ liệu dạng cây, hoàn toàn khác với ban đầu
Các thuật toán so trùng mẫu đơn, như Boyer-Moore hoặc Knuth-Morris-Pratt, sử dụng heuristics để giảm số lượng các ký tự so sánh cần thiết để so trùng Bằng cách lặp đi lặp lại việc tìm kiếm các mẫu đơn trong các đa mẫu, mô hình thuật toán tìm kiếm mẫu đơn có thể áp dụng để tìm kiếm đa mẫu Tuy nhiên, cách tiếp cận này không áp dụng cho cơ sở dữ liệu có quy mô lớn và có kích thước biến thiên lớn Các thuật toán áp dụng phương pháp này không cần phải lưu kết quả so trùng qua từng giai đoạn tìm kiếm và cũng không lợi dụng đặc điểm của cơ sở dữ liệu
Phần mềm hiện thực tìm kiếm đa mẫu thường tiêu thụ tài nguyên hệ thống lớn hơn so với so trùng mẫu đơn Khi số lượng mẫu càng lớn, vì tính chất tuần tự thuần túy trong bộ xử lý trung tâm của phần mềm, nên tốc độ của hệ thống sẽ giảm đáng kể Kết quả là nhiều công trình nghiên cứu để hiện thực thuật toán so trùng đa mẫu trên phần cứng để tăng tốc quá trình này Tuy nhiên việc so trùng đa mẫu vẫn là bài toán phức tạp đặc biệt là xử lý trên phần cứng
Trong phần tiếp theo chủ yếu giới thiệu các dạng của thuật toán so trùng đa mẫu thực hiện trên phần cứng.
Tổng quan các nghiên cứu trước đây
Phần này nêu ra các phương pháp tiếp cận bài toán so trùng mẫu sử dụng phần cứng Các giải pháp cho bài toán so trùng mẫu sử dụng phần cứng đầu tiên dựa trên CAM (content-addressable memory) và nền tảng phần cứng ASIC (application-specific integrated circuit) Các giải pháp mới sau này sử dụng FPGA
CAM lưu các mẫu virus trong các bảng trong bộ nhớ Quá trình quét tuy diễn ra song song nhưng cần phải so sánh qua toàn bộ các mẫu Các ứng dụng CAM thường tiêu tốn bộ nhớ rất lớn, khi tập dữ liệu gia tăng, ngoài ra ra chi phí bộ nhớ phần cứng của CAM khá lớn và tiêu tốn nhiều năng lượng hơn
Giải pháp ASIC hoạt động như một vi xử lý có thể sử dụng cho nhiều mục đích
Vì vậy giải pháp này không có khả năng đạt được mức độ xử lý song song được cung cấp bởi FPGA
Với những đặc điểm nổi trội, FPGA trở thành công nghệ nền tảng để tăng tốc các bộ so trùng chuỗi Đặc tính song song của nó giúp cho việc tăng tốc bộ so trùng chuỗi trở nên dễ dàng Quan trọng nhất, khả năng tái lập trình của FPGA cung cấp khả năng cập nhật dễ dàng cho các cơ sở dữ liệu virus thay đổi hằng ngày, của các ứng dụng so trùng chuỗi Với công nghệ FPGA, phần cứng có thể được tối ưu hóa cho sơ sở dữ liệu có khả năng cập nhật dữ liệu thường xuyên Các hướng tiếp cận bài toán so trùng chuỗi động trên FPGA bao gồm phương pháp máy trạng thái (FSM), và nhóm kỹ thuật hash: Perfect Hash, bộ lọc Bloom, bộ lọc Bloomier
2.2.1 Phương pháp máy trạng thái
Phương pháp sử dụng máy trạng thái hữu hạn là một mô hình bao gồm một số lượng nhất định các trạng thái, sự chuyển trạng thái giữa các trạng thái tương tự như một lưu đồ mô tả hoạt động nào sẽ diễn ra khi điều kiện đầu vào được thỏa mãn Phương pháp tiếp cận này đặc biệt phù hợp cho phần cứng FPGA, do có thể sử dụng các bộ flip flop có sẵn để hiện thực các trạng thái Nhìn chung, phương pháp máy trạng thái thường được nghiên cứu và hiện thực dựa trên thuật toán Aho-Corasick (AC) [2] và các biến thể của nó Đầu tiên, thuật toán sẽ chuyển đổi các mẫu trong tập cơ sở dữ liệu mẫu thành các cây AC (cây trạng thái Aho-Corasick), mỗi cạnh của cây biểu diễn cho một ký tự trong mẫu đang xét Hình 2-1 biểu diễn một cây AC đơn giản
Bắt đầu từ trạng thái 0, hệ thống sẽ chuyển sang trạng thái 1 khi tín hiệu vào là
Nếu hệ thống nhận được tín hiệu “e”, nó sẽ chuyển qua trạng thái 2 và đưa ra output “he” Nếu tín hiệu vào là “i”, hệ thống sẽ chuyển sang trạng thái 6 và đợi tín hiệu vào tiếp theo Nếu tín hiệu vào khác “e” và “i”, hệ thống sẽ trở về trạng thái 0 và đợi tín hiệu vào tiếp theo
Có hai cách hiện thực cây AC 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 và hàm có chức năng tương tự ở NFA trả về một tập các trạng thái, 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 tích cực Do
8 đó, thời gian chuyển trạng thái của DFA ít hơn so với NFA, tuy nhiên DFA lại chịu sự bùng nổ trạng thái hơn so với NFA Chính những ưu khuyết điểm của từng mô hình này tạo nên những thuận lợi và khó khăn khi hiện thực trên các thiết bị phần cứng
Hình 2-2 là ví dụ về DFA và NFA Trạng thái S0 đóng vai trò là trạng thái bắt đầu trong cả hai mô hình Tại trạng thái S0 trong mô hình DFA các tín hiệu chuyển trạng thái có thể là 0 hoặc 1, nhưng trong NFA cho phép các cạnh ra có thể không có nhãn (không có ký tự đầu vào), các cạnh này gọi là chuyển trạng thái epsilon (ɛ-transition)
Giải thuật AC có hai ưu điểm lớn:
Độ phức tạp của giải thuật là một hằng số, nó chỉ phụ thuộc vào chiều dài của mẫu, không phục thuộc vào độ lớn của tập dữ liệu Mặc dù giải thuật
AC thực hiện chậm hơn so với các phương pháp sử dụng heuristic, nhưng trong trường hợp xấu nhất, thời gian thực thi vẫn là một hằng số
Các biểu thức chính qui có thể ánh xạ dễ dàng vào cây AC Như đã đề cập ở trên, đặc tính này đặc biệt hữu ích cho các ứng dụng antivirus Tuy nhiên, việc sử dụng có thể dẫn đến sự bùng nổ trạng thái trong các mô hình máy trạng thái NFA và DFA
Tuy nhiên, giải thuật AC tồn tại hai giới hạn lớn:
Sử dụng nhiều bộ nhớ hơn so với phương pháp sử dụng băm như bộ lọc Bloom, đặc biệt đối với tập mẫu có chiều dài trung bình lớn như ClamAV
Khi thêm một mẫu mới vào, cần phải xây dựng lại toàn bộ cây AC Hạn chế này có ý nghĩa lớn khi hiện thực trên phần cứng mà các trạng thái sử dụng các bộ flip flop Xây dựng lại cây AC đồng nghĩa với việc phải lập trình lại phần cứng Trong khi với kỹ thuật FPGA, việc tạo ra và kiểm tra các bitstream tốn rất nhiều thời gian và công sức cho mỗi lần cập nhật Dữ liệu virus thay đổi hằng ngày, vì vậy việc cập nhật liên tục là một thách thức không nhỏ khi sử dụng phương pháp này
Nhiều biến thể của thuật toán AC đã được đề xuất để cải thiện hiệu suất và sử dụng bộ nhớ hiệu quả hơn Ví dụ như chia phân vùng trạng thái được giới thiệu trong [3] Mô hình B-FSM trong [4] có thêm tính năng chuyển bảng băm khi có sự xung đột, cho ra được kết quả với hiệu suất và hiệu quả sử dụng bộ nhớ cao.Tuy nhiên, với những cải tiến này, giải pháp xây dựng cây AC dựa trên phần cứng chỉ có thể thực hiện được với hơn vài ngàn mẫu trong Snort trên các dòng FPGA hiện nay Số lượng bộ nhớ tiêu thụ tỷ lệ thuận với số ký tự trong cơ sở dữ liệu
Hash checksum là một phương pháp dựa trên giải thuật băm (hash) để xác định mẫu bằng cách so sánh giá trị băm (checksum) của chuỗi ký tự đầu vào với các giá trị băm của các mẫu trong cơ sở dữ liệu Đầu tiên, phương pháp này chọn một hàm băm (hash function) bất kỳ để tính toán trước các giá trị băm của toàn bộ mẫu trong tập cơ sở dữ liệu Sau đó kết quả băm như trên được lưu trữ trong một tập hợp, thường là mảng Với cùng một hàm băm như trên, mẫu có thể xác định có xuất hiện hay không dữ liệu đầu vào, chỉ đơn giản bằng cách tiến hành băm dữ liệu đầu vào và so sánh kết quả giá trị băm đó với các tập giá trị băm của các mẫu đã được tính toán trước Nếu giá trị băm của đầu vào giống với giá trị băm của một mẫu nào đó, ta có thể nói mẫu đó có xuất hiện trong dữ liệu đầu vào Ưu điểm chính của phương pháp tiếp cận này cho bài toán so trùng mẫu là sự đơn giản của thuật toán, phương pháp này dễ dàng thực hiện trên cả phần mềm và phần cứng Ngoài ra, bởi vì phương pháp này chỉ lưu trữ các giá trị băm và các giá trị băm thường không phụ thuộc vào chiều dài của mẫu và cấu trúc dữ liệu đơn giản hơn, nên các giải pháp lưu trữ thường hiệu quả hơn nhiều so với các phương pháp khác
Tuy nhiên, việc sử dụng hash checksum cũng có hai nhược điểm chính sau:
Đầu tiên, không giống như FSM thể hiện kết quả chính xác, phương pháp băm chỉ cho câu trả lời gần chính xác với một xác suất nhỏ xảy ra “false positive”, ”false positive” là tên gọi cho trường hợp xảy ra khi trong chuỗi đầu vào không có xuất hiện một mẫu nào trong tập cơ sở dữ liệu, nhưng khi qua bộ so trùng bảo là có xuất hiện “false positive” là một vấn đề phổ biến và không tránh khỏi của các phương pháp sử dụng băm Kết quả là cần thêm một bước so sánh để xác định có thực sự trùng hay không
Bộ so trùng mẫu đơn Bloom và Bloomier
2.3.1 Bộ lọc Bloom và Bloomier
Bộ lọc Bloom chỉ hiệu quả khi kiểm tra một mẫu có trong tập mẫu hay không, với sác xuất có thể chấp nhận được, tuy nhiên vẫn xảy ra các trường hợp “false positive”
Vì vậy, để đảm bảo kết quả so trùng là chính xác, một bộ so trùng chính xác cuối cùng thực hiện việc so trùng mẫu đầu vào đang xem xét với tất cả các mẫu trong tập mẫu Vì vậy với kích thước lớn của tập mẫu ClamAV, thì việc so trùng chính xác tốn rất nhiều thời gian
Tuy nhiên, bộ lọc Bloomier lại chỉ ra được vị trí của mẫu trong bảng băm Vì vậy, quá trình so trùng chính xác cuối cùng chỉ cần thực hiện một tác vụ so sánh Mặc dù vậy, bộ lọc Bloomier luôn luôn phải thực hiện quá trình so trùng chính xác Đây cũng là điểm bất lợi lớn nhất khi triển khai trên các hệ thống lưu trữ chuỗi ký tự của mẫu trong các bộ nhớ ngoài Hệ thống phải thực hiện truy cập vào bộ nhớ ngoài trong mỗi chuỗi tìm kiếm Việc truy cập bộ nhớ ngoài liên tục làm giảm hiệu suất của hệ thống đáng kể Chính vì điểm này, mà bộ lọc Bloomier có hiệu năng thấp hơn so với bộ lọc Bloom, bộ lọc Bloom chỉ thực hiện đối chiếu khi tất cả các vị trí mà các giá trị băm trỏ tới có giá trị là “1”
Việc kết hợp bộ lọc Bloom và bộ lọc Bloomier được đề cập trong [9], để giảm thiểu quá trình so trùng chính xác yêu cầu phải truy xuất bộ nhớ ngoài có tốc độ thấp Phương pháp này đòi hỏi phải sử dụng nhiều hơn một bit chỉ mục của bảng băm Các
“Bloom bit” được đặt cạnh các bit của Bloomier Các “Bloom bit” này không phải là một phần các bit thông tin mã hóa của Bloomier Tất cả các “Bloom bit” trong bảng băm hoạt động độc lập với các bit thông tin của Bloomier Bộ lọc Bloom được sử dụng để kiểm tra xem chuỗi đang truy vấn có trong tập hay không Nếu tất cả các bit trong các vị trí băm có giá trị là “1”, sau đó hệ thống sẽ giải mã thông tin từ các bit Bloomier để tìm ra mẫu tương ứng Ưu điểm chính của sự kết hợp này so với bộ lọc Bloom và Bloomier được thể hiện trong ví dụ sau
Các giá trị đầu vào T = {w,y,d}
Bảng 2-3 So sánh hoạt động của bộ lọc Bloom, bộ lọc Bloomier và Bloom Bloomier Kết quả cho thấy rằng bộ lọc Bloom-Bloomier có tối thiểu số lần truy cập bộ nhớ off-chip Vì thế, hiệu quả của Bloom-Bloomier là cao nhất so với bộ lọc Bloom Filter và bộ lọc Bloomier
Bảng 2-3 So sánh hoạt động của các bộ lọc Bloom, Bloomier và Bloom-Bloomier
Bộ lọc Bloom Không tồn tại trong tập P
Có thể có trong tập
P So sánh “y” với tất cả mẫu trong tập
Có thể có trong tập
P So sánh “d” với tất cả mẫu trong tập
Bộ lọc Bloomier So sánh “w” với mẫu “b” Kết quả không trùng
So sánh “y” với mẫu “e” Kết quả không trùng
So sánh “d” với mẫu “d” Kết quả trùng
Không tồn tại trong tập P
Có thể có trong tập
P So sánh “y” với mẫu “e” Kết quả không trùng
Có thể có trong tập
P So sánh “d” với mẫu “d” Kết quả không trùng
Do cấu trúc song song và pipeline của hệ thống, bộ so trùng BBF sử dùng Shift- add-xor (SAX) là hàm băm của hệ thống [11] Ngoài ra, các BBF sẽ so sánh các chuỗi
22 tìm kiếm với các chuỗi ký tự ban đầu của mẫu từ bộ nhớ off-chip khi có một tín hiệu từ các bộ BBU xác nhận là trùng, do đó các thông tin được mã hóa trong các chỉ mục của bảng băm là địa chỉ của mẫu tương ứng trong bộ nhớ off-chip
SAX là một lớp hàm băm, với giá trị băm là chuỗi ký tự, được thể hiện ở công thức sau
SAX rất dễ dàng hiện thực trên phần cứng Chỉ với các tác vụ dịch (shift), cộng (add) và XOR, phần cứng hiện thực SAX chỉ sử dụng các bộ logic đơn giản mà không cần bất kỳ bộ nhân hay các bộ tốn nhiều chu kỳ clock Ngoài ra, hàm SAX có thể hoàn toàn hiện thực bằng phương pháp pipeline Bằng cách chọn chiều dài của hàm SAX bằng với chiều dài của mẫu lớn nhất, các bộ lọc BBF, có cùng chiều dài với các bộ SAX tương ứng, có thể sử dụng chung các dữ liệu đầu ra Thiết kế này được thể hiện ở Hình 2-6
Hình 2-6 Cấu trúc pipline của hàm hash
Số lượng các hàm băm sử dụng trong BBF có ảnh hưởng lớn đến hiệu suất của hệ thống vì nó ảnh hưởng đến tỷ lệ “false positive” của bộ lọc Tỷ lệ “false possitive” cao dẫn đến sẽ có nhiều chuỗi nghi ngờ cần phải được kiểm tra, khả năng tràn các vùng đệm (FIFO) cũng sẽ tăng lên Khi trường hợp này xảy ra, hệ thống sẽ chấm dứt hoạt động, các dữ
23 liệu trước đó sẽ bị xóa Sơ đồ trong Hình 2-7 mô tả mối liên hệ giữa số lượng hàm băm với tỷ lệ “false positive”
Hình 2-7 Số lượng các hàm hash và tỷ lệ “false positive” tương ứng Tỷ lệ “false positive” giảm đáng kể với sự gia tăng của các hàm hash: từ 83% (2 hàm hash) đến 0,02% (14 hàm hash)
2.3.3 Kiến trúc bộ so trùng mẫu BBF
Hệ thống BBFex là một hệ thống so trùng chuỗi với tốc độ cao Hệ thống được thiết kế theo phương pháp hashing và có khả năng so trùng cho một cơ sở dữ liệu với nhiều chuỗi tĩnh có độ dài khác nhau, Hình 2-8
HM HM HM HM HM
BBM0 BBM1 BBM2 BBM3 BBM4 CAM
Hình 2-8 Kiến trúc hệ thống BBFex
Hệ thống có ba khối chính gồm: khối so trùng ký tự (Character Scanning Unit), khối xử lý chính (Arbiter Unit) và khối so sánh (Comparison Unit)
Khối Character Scanning Unit gồm một chuỗi các khối Hash (HM - Hash Module) để tính toán giá trị hash cho các chuỗi có độ dài từ 1 đến 128 ký tự có thể tạo thành từ dữ liệu đi vào Khối còn có năm khối Bloom-Bloomier (BBM –Bloom-Bloomier Module) tương ứng với các độ dài chuỗi: 8, 16, 32, 64 và 128 Mỗi khối BBM giá trị hash từ các khối HM và dùng giá trị hash này làm lấy ra các Bloom bits và
Bloomier bits Nếu các Bloom bit đều bằng 1, thông tin của chuỗi (giá trị hash, fragment type) được đưa tiếp qua khối Arbiter Unit để xử lý
Khối Arbiter Unit gồm năm khối DM (Defrag Module) tương ứng với năm khối BBM ở Character Scanning Unit Vì khối so trùng ký tự có năm bộ BBM chỉ so trùng được các chuỗi có độ dài cố định là 8, 16, 32, 64, 128 nên để có thể so trùng các chuỗi có độ dài từ 8 đến 256, ta chia mỗi chuỗi này thành hai mảnh có độ dài cố định là 8, 16,
Ví dụ chuỗi 1234567890 sẽ được chia làm hai mảnh 12345678 và 34567890 với khoảng cách giữa hai mảnh này là 6
Thông tin các mảnh của các mẫu được xử lý trước và lưu trong SRAM trong Bảng 2-4 và Bảng 2-5 Dữ liệu này gồm 72 bit chứa thông tin một mảnh và có thể nhận biết được mảnh còn lại để tái tạo lại mẫu ban đầu
Bảng 2-4 Nội dung của một Fragment
Tên trường Số bit Chú thích
Next hash value 17 Giá trị hash của mảnh được mong được
Next distance 7 Khoảng cách giữa 2 mảnh
Base ID 16 ID của mẫu tạo thành từ 2 mảnh
01 Mảnh thứ hai, có chứa giá trị tham khảo
11 Vừa là mảnh thứ nhất trong mẫu này và là mảnh thứ hai trong mẫu khác
NetFPGA Platform
NetFPGA là đề tài nghiên cứu của trường đại học Standford, là một platform phần cứng tái cấu hình chi phí thấp chuyên dụng cho mạng tốc độ cao Trên board NetFPGA bao gồm các khối logic, bộ nhớ và các card Gigabit Ethernet để từ đó người sử dụng có thể xây dựng nên một switch, router hay một thiết bị an ninh mạng Bởi vì toàn bộ module truyền/định tuyến gói dữ liệu được hiện thực trên phần cứng, hệ thống có thể hỗ trợ các gói dữ liệu truyền ở tốc độ Gigabit với độ trễ xử lý (processing latency) chỉ trong vài chu kỳ clock
Hình 2-9 mô tả sơ đồ khối của NetFPGA 10G [10] bao gồm một chip Xilinx FPGA lớn của họ Virtex-5 hoạt động với tần số clock là 250 MHz Chức năng của chip này được lập trình bởi người sử dụng Bên cạnh, NetFPGA cung cấp 8 kênh chuẩn truyền PCI express thế hệ thứ 2, có thể đạt tốc độ 5Gbps cho một kênh
Ba SRAM ngoại 72 MBit của hãng Cyress được cấu hình từ 2MB 36-bit word (tổng cộng 3 * 2MB * 36 = 27 MB) và hoạt động đồng bộ với xung clock 300 MHz Bốn bank của SDRAM DDR2 ngoại hãng Micron được cấu hình từ 16M 32-bit word (64 MB tổng cộng) Một bộ nhớ có băng thông đạt 400 MWords một giây (tương đương 12800 Mb/s)
Bộ truyền nhận ngoại lớp vật lý của hãng Broadcom EDC gửi gói dữ liệu qua các cable chuẩn SFP+ cho phép truyền dữ liệu ở hai chế độ: 10Gbps và 1Gbps
Các đặc điểm kỹ thuật chính của NetFPGA:
Xilinx Virtex-5 XC5VTX240TFFG1759 -2
4 Ethernet Ports, support both 10Gbps and 1Gbps modes
X8 PCI Express Gen 2 (5Gbps/lane)
Twenty Configurable GTX Serial Transceivers (available through two high-speed Samtec connectors)
Three x36 QDR II (CY7C1515KV18)
Four x32 RLDRAM II (MT49H16M36BM-25)
Two Platform XL Flash (128mb each)
TỔNG QUAN
Tập cơ sở dữ liệu chữ ký mẫu virus của ClamAV
Toàn bộ mã nguồn của dự án ClamAV có sẵn trên SourceFire.net và đã được chạy thử trên nhiều loại hệ điều hành khác nhau bao gồm Linux và windows.Tất cả công việc trình bày trong luận văn dựa trên phiên bản ClamAV 0.98.4 phát hành ngày 17-09-2013 Để phát hiện virus máy tính, ClamAV dựa trên việc so sánh các dữ liệu đầu vào với các mẫu trong tập cơ sở dữ liệu chữ ký virus Cơ sở dữ liệu của ClamAV được phát hành trong 2 gói: cơ sở dữ liệu chính thức, đi kèm với các phiên bản phần mềm, và cơ sở dữ liệu được cập nhật hằng ngày Tập cơ sở dữ liệu chính cung cấp chính xác và nhất quán về các mẫu virus hơn là tập cơ sở dữ liệu hằng ngày, do các mẫu virus trong tập hằng ngày sẽ được kiểm tra và đưa vào tập cơ sở dữ liệu chính thức Vì vậy, luận văn sẽ tập trung vào phân tích tập cơ sở dữ liệu chính thức
Cơ sở dữ liệu virus chính của ClamAV được lưu trữ trong file main.cvd File này sẽ được update trên mỗi version của ClamAV Ngoài ra, người dùng còn có thể update cơ sở dữ liệu hằng ngày thông qua lệnh freshclam Chương trình sẽ tải dữ liệu mới và chứa trong file daily.cvd Trong đó, một số thông tin chính như:
“Build time”: chỉ ra ngày tạo file
“Signatures”: số lượng mẫu trong file (hiện tại số mẫu là 2525225 mẫu)
Ví dụ: Thông tin của tập tin main.cvd, sau khi dùng lệnh sigtool sigtool info main.cvd
U44YuTP7vNpU3sZVfI54S78bkaJluqmkJCFX8skaNcNUPoTLnTxXtSuOwWufwn+ M+21kGR0CO7hvU3K+44YuOA92rMNNNmKOJOnli+lGv972THU2dkCL+491C6 Y4Q+169wIW+Zp/TyH93yt75qGv8vanBM1QdyXk8fnDvsOlC4
File cvd là một file nén chứa tập hợp các file nhỏ hơn, chứa danh sách các mẫu virus Mẫu virus trong mỗi file có định dạng khác nhau bao gồm các file với đuôi là db,.hdb,.mdb,.ndb…Hình 3-1 mô tả các định dạng khác nhau trong các file kể trên
Hình 3-1 các mẫu chữ ký virus trong các tập tin cở sở dữ liệu của ClamAV
Ngoài các giá trị MD5 và chuỗi hex của virus, các file còn có thêm các thông tin về giá trị offset, loại tập tin… Tùy vào các giá trị này và dữ liệu tập tin đang quét, mà ClamAV có những cách hành xử khác nhau Tuy nhiên, như đã giới thiệu ở chương 1, ClamAV vẫn phải tìm kiếm sự tồn tại của các mẫu virus trong các dữ liệu đầu vào Vì vậy, luận văn chỉ tập trung vào tìm kiếm chuỗi hex trên các dữ liệu đầu vào, không quan tâm đến các giá trị offset và loại tập tin
Phần tiếp theo tập trung diễn giải, phân tích đánh giá và thời gian quét từng loại định dạng mẫu virus chứa trong các tập tin cơ sở dữ liệu của ClamAV Từ đó, trình bày phương pháp tiếp cận các mẫu virus động mà luận văn đề cập đến
Mỗi mẫu chữ ký virus trong ClamAV có thể được phân thành 3 dạng: MD5 (message- digest algorithm 5 checksum), mẫu tĩnh và mẫu động Bảng 3-1 cho thấy tỷ lệ phân bố các mẫu trong trong tập tin cơ sở dữ liệu chính (main.cvd)
Bảng 3-1 Kết quả phân tích cơ sở dữ liệu ClamAV
Tỷ lệ thời gian quyét
Mẫu MD5 là một giá trị băm 128-bit đơn giản mà có thể được sử dụng để xác định các tập tin độc hại, bằng cách tính toán checksum MD5 của toàn bộ tập tin đầu vào và so sánh nó với mẫu checksum MD5 đã biết trước Lợi thế của việc sử dụng MD5 checksum là bất kỳ người sử dụng nào có thể tạo ra và đề trình mẫu MD5 checksum một cách dễ dàng Vì vậy, việc đó cung cấp một giải pháp tức thời để phản ứng chống lại các mối đe dọa mới Tuy nhiên, ngoài những tiện ích trên, bất kỳ sự thay đổi nhỏ nào trong
32 các mẫu độc hại đã xác định trước thường phải tạo ra chuỗi MD5 checksum mới, vì chuỗi MD5 mới rất có thể hoàn toàn khác so với chuỗi cũ
Mẫu tĩnh là một chuỗi byte liên tục với chiều dài cố định Virus có thể phát hiện bằng cách quét qua các chuỗi byte đầu vào và so sánh với tập mẫu tĩnh So sánh với mẫu MD5, mẫu tĩnh cung cấp cách mô tả virus linh hoạt hơn mà không bị giới hạn trong một chiều dài 128-bit cố định
Mẫu động là phần mở rộng của mẫu tĩnh mà sử dụng các biểu thức chính qui (Regular Expression) để diễn tả, 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 qui giúp cho việc mô tả các mẫu virus khái quát hơn, từ đó dẫn đến việc giảm số lượng các mẫu trong cơ sở dữ liệu Ngoài ra, lợi ích quan trọng nhất, việc sử dụng biểu thức chính qui là cần thiết để phát hiện các virus đa hình (polymorphic virus), các virus có khả năng biến đổi một phần bằng cách mã hóa hoặc nén lại để tránh trùng với các mẫu MD5 và mẫu tĩnh Biểu thức chính qui được viết bằng một ngôn ngữ hình thức với một cú pháp nhất định Chúng bao gồm một số toán tử cơ bản (hay còn gọi là các wildcard), mà nếu kết hợp với nhau, ta có thể mô tả bất kỳ một tập các chuỗi phức tạp nào một cách súc tích
Bộ so trùng chuỗi trong luận văn được thiết kế phù hợp với các mẫu động Như đã trình bày ở chương 1, do sự đơn giản của thuật toán, nên mặc dù MD5 có số lượng mẫu lớn nhất, nhưng chỉ chiếm khoảng 8.2% thời gian quét Vì vậy rất ít khả năng để tăng tốc với phần cứng chuyên dụng Đối với mẫu tĩnh, các phương pháp nêu trong chương
2, đặc biệt là bộ BBF, giải quyết khá tốt bài toán so trùng mẫu tĩnh Đối với mẫu động, tuy số lượng mẫu chí có 9670 mẫu, nhưng thời gian quét lại lên đến 27.94% thời gian quét, trung bình quét một mẫu virus động chiếm 27.94 %
9670 = 0.0028 %, trong khi đó đối với mẫu tĩnh là 0.000072% và MD5 là rất rất nhỏ Vì vậy luận văn tập trung vào việc xây dựng bộ so trùng mẫu động trên phần cứng
Phần tiếp theo sẽ đi sâu vào chi tiết mẫu động trong cơ sở dữ liệu của ClamAV và hướng giải quyết
Như đã giới thiệu trong phần trước, mẫu động bao gồm các chuỗi byte, đan xen với các toán tử wildcard Kết quả là sau khi phân rã mẫu động thì ta được nhiều mẫu con (sub-pattern), các mẫu con không có chứa toán tử wildcard, và các toán tử wildcard.Ví dụ như trong Hình 3-2, sau khi phân tích mẫu động của virus có tên là DOS.Arcv.1183, ta được kết quả là gồm 2 nhóm: nhóm các sub-pattern và nhóm các toán tử wildcards
Hình 3-2 Kết quả phân rã mẫu động
Có 8 loại wildcard thường xuất hiện trong ClamAV được mô tả trong Bảng 3-2 Các wildcard định nghĩa một chiều dài có thể thay thế bằng các byte bất kỳ hoặc các byte được chỉ dịnh trước Mẫu động xuất hiện trong các file main.db và main.ndb (các file thu được sau khi phân rã main.cvd)
Bảng 3-2 Các wildcard xuất hiện trong cở sở dữ liệu ClamAV wildcard Diễn giải
?? So trùng với một byte bất kì
* So trùng với một số lượng byte bất kì
{-n} So trùng với n byte hoặc ít hơn
{n-} So trùng với n byte hoặc nhiều hơn
{n-m} So trùng từ n byte đến m byte (m > n)
(aa|bb|cc| ) So trùng với aa hoặc bb hoặc cc aa[x-y]HEXSIG hoặc
Chuỗi aa được so trùng trước hoặc sau một khoảng cách từ x đến y so với chuỗi HEXSIG, và các giá trị offset trong HEXSIG được tính theo aa
Bên dưới là một số ví dụ của các mẫu wildcard:
Mẫu a??b so trùng với chuỗi ‘abb’, ‘acb’ nhưng không trùng với chuỗi ‘ab’
Mẫu a*b so trùng với chuỗi ‘abb’,’acb’ và cả ‘ab’
Mẫu a{2}b so trùng với chuỗi ‘aaab’ và ‘accb’ nhưng không trùng với chuỗi
Mẫu a{-2}b so trùng với chuỗi ‘aaab’, ‘accb’ và cả ‘acb’ nhưng không trùng với chuỗi ‘acccb’
Mẫu a{2-}b so trùng với chuỗi ‘aaab’, ‘accb’ và cả ‘acccb’ nhưng không trùng với chuỗi ‘acb’
Mẫu a{1-2}b so trùng với chuỗi ‘aaab’, ‘accb’ và cả ‘acb’ nhưng không trùng với chuỗi ‘ab’ hoặc ‘acccb’
Mẫu a(c|d)b chỉ so trùng với chuỗi ‘acb’ và ‘adb’
Hình 3-3 là thống kê số lượng mẫu theo từng loại wildcard Tổng số mẫu động là
So trùng mẫu động trên phần cứng
Mục tiêu của luận văn là thiết kế bộ so trùng mẫu động trên phần cứng để tăng tốc ClamAV Ngoài ra, hệ thống so trùng mẫu động được thiết kế để giảm tải cho các ứng dụng chống virus trên máy tính cá nhân hay các máy chủ Thiết bị netFPGA 10G, sử dụng trong luận văn, giao tiếp với CPU máy tính thông qua chuẩn PCI-Express như trong Hình 3-4 Dữ liệu các chuỗi Hex của mẫu virus được lưu trong các bộ nhớ ngoài (off-chip memory)
Dữ liệu đầu vào cho bộ so trùng mẫu động trên phần cứng là một chuỗi byte thô của một luồng chuỗi ký tự tuần tự Một virus đa hình có thể được nhận dạng nếu luồng đầu vào có chứa bất kỳ mẫu động trong cơ sở dữ liệu của ClamAV
Hình 3-4 Mô hình giao tiếp của module xử lý mẫu động
Toàn bộ nội dung việc xây dựng bộ so trùng mẫu động gồm hai phần chính: Phần cứng khả cấu hình và phần mềm phân tích, tổng hợp luật Dựa trên tập cơ sở dữ liệu chữ ký virus và đặc tả về hệ thống, phần mềm phân tích và tổng hợp các mẫu cho phép xây dựng nhanh chóng phần cứng khả cấu hình Phần tiếp theo đi vào trình bày tổng quan nội dung của từng phần Chi tiết thiết kế và hiện thực được mô tả cụ thể trong các chương tiếp theo
3.2.1 Phân tích và tổng hợp tập mẫu virus
Phần mềm phân tích và tổng hợp luật tiền xử lý tập mẫu của hệ thống phát hiện xâm nhập mạng, từ đó xây dựng nên kiến trúc phần cứng phù hợp cùng các dữ liệu cần thiết để có thể tổng hợp hệ thống Quy trình thiết kế được môt tả trong Hình 3-5 bắt đầu
38 với dữ liệu nhập là tập cơ sở dữ liệu mẫu (Virus Signature Database) và các cấu hình (hay yêu cầu) trong việc triển khai hệ thống (Configuration)
Database Pattern Pattern Analyzer and Compiler
Memory content files Initial data
Hình 3-5 Mô hình tổng quát phân tích xử lý mẫu động và xây dựng hệ thống
Configuration chứa các yêu cầu về tập mẫu và kiến trúc phần cứng bên dưới Phần mềm dựa trên các yêu cầu về tập quy luật để loại bỏ bớt các mẫu không phù hợp trước khi tiến hành trích xuất mẫu và xây dựng kiến trúc phần cứng Kiến trúc phần cứng được sinh ra bởi phần mềm gồm hai phần, phần đặc tả kiến trúc dạng thanh ghi (Configurable Hardware) và phần nội dung các khối bộ nhớ (memory content) Configuralbe Hardware bao gồm các file verilog, file đặc tả lõi IPCore và các tham số (parameter) Trong kiến trúc phần cứng của module so trùng mẫu động sử dụng nhiều khối bộ nhớ onchip, dữ liệu cho các khối bộ nhớ này có thể khởi tạo trong quá trình tổng hợp hệ thống, hoặc cập nhật khi triển khai hệ thống
Sau khi có được kiến trúc phần cứng và nội dung của các khối bộ nhớ Tại thời điểm này có thể sử dụng các công cụ hỗ trợ (Synthesis tools) để mô phỏng, kiểm tra thiết kế và tổng hợp ra bit file nạp lên chip FPGA
3.2.2 Kiến trúc phần cứng Để có thể tận dụng được các chức năng của phần mềm phân tích và tổng hợp luật, kiến trúc phần cứng phải được thiết kế mềm dẻo bằng việc sử dụng linh hoạt các khối bộ nhớ và các tham số (parameter) khi đặc tả chức năng Hình 3-6 là lược đồ xử lý dữ liệu đầu vào với cơ sở dữ liệu mẫu động trên phần cứng Bắt đầu với dòng dữ liệu cần quét đi vào bộ so trùng các mẫu con (Sub-pattern Matching), bộ này chỉ quét và tìm ra sự xuất hiện của các mẫu con của một mẫu virus động nào đấy Sau đó kết quả được đưa đến bộ Pattern Reassembly, bộ này có nhiệm vụ chính là kiểm tra các ràng buộc giữa các mẫu được tìm thấy ở bộ sub-pattern matching, nếu một chuỗi dữ liệu đầu vào có sự xuất hiện của các mẫu con và thỏa các ràng buộc của bất kỳ mẫu virus động nào, thì bộ Pattern Reassembly sẽ đưa ra kết luận là ID của virus được phát hiện (ID này được sử dụng để truy vấn trong cơ sở dữ liệu virus) Toàn bộ các ràng buộc của các mẫu virus được lưu trữ và truy xuất từ bộ metadata unit
Sub-pattern Matching Input Stream
Hình 3-6 Mô hình tổng quát kiến trúc phần cứng của bộ so trùng mẫu động
Module so trùng mẫu tĩnh được hiện thực dựa trên kiến trúc bộ BBF Một ưu điểm của kiến trúc này là khả năng thiết kế hoàn toàn dựa trên bộ nhớ Nhờ đó việc cập nhật tập mẫu mới có thể thực hiện nhanh chóng và dễ dàng hơn
Các wildcards trong các mẫu động chỉ ra các ràng buộc giữa các mẫu con với nhau Các dạng wildcards được biến đổi về cùng một cấu trúc, sau đó sẽ xây dựng các thông tin ràng buộc của từng mẫu và lưu trữ trong các khối metadata unit Dựa trên các ràng buộc đó, bộ Pattern Reassembly lưu trữ các dấu vết, trạng thái của các ràng buộc đang theo dõi Các thông tin để lưu vết dược truy xuất thường xuyên, nên cần được lưu trữ trong các bộ nhớ trong (on chip memoy) Tuy nhiên, các bộ nhớ trong có giới hạn về mặt dung lượng vì vậy, trong cùng một thời điểm, chỉ lưu trữ một số lượng nhất định các thông tin
HIỆN THỰC PHẦN CỨNG
Tổng quan
Pattern Matching Module Arbiter Module
Trace metadata events events events
Hình 4-1 Tổng quan kiến trúc so trùng mẫu chữ ký virus động
Tổng quan kiến trúc của hệ thống quét mẫu chữ ký virus động được trình bày như trong Hình 4-1 Hệ thống được chia thành hai phần chính: Pattern Matching Module và Pattern Reassembly Module Như đã thảo luận trong phần trước, có hai loại mẫu chữ ký virus trong tập cơ sở dữ liệu mẫu chữ ký virus của ClamAV: mẫu chứ ký tĩnh và mẫu chữ ký động Mẫu chữ ký dộng có thể được phân tách thành nhiều mẫu chữ ký tĩnh kết hợp với các kí tự đặc biệt (wildcard) Việc tìm kiếm mẫu chữ ký động có thể thực hiện
42 dựa trên việc tìm kiếm các mẫu chữ ký tĩnh rời rạc, sau đó ghép nối (reassembly) dựa trên các điều kiện ràng buộc (wildcard) Trong kiến trúc hệ thống này, các mẫu chữ ký tĩnh rời rạc sẽ được tìm kiếm bởi module Pattern Matching Module, trong khi đó việc ghép nối các mẫu chữ ký tĩnh thành mẫu động hoàn chỉnh sẽ được thực hiện bởi Pattern Reassembly Module
Luồng xử lý của hệ thống sẽ như sau Dữ liệu quét đọc từ tập tin hay từ buffer mạng được truyền đến máy so trùng trên FPGA Dữ liệu này sẽ được quét bởi Pattern Matching Module (PMM) PMM sẽ tìm kiếm sự xuất hiện của các mẫu chữ ký tĩnh và các mẫu chữ ký con Nếu tìm thấy sự xuất hiện của mẫu này, PMM sẽ phát sinh một sự kiện (Event) với thông tin về mẫu vừa phát hiện, loại mẫu cũng như vị trí xuất hiện mẫu đến Arbiter Module (AM) AM đóng vai trò là module trung chuyển, quyết định trả kết quả so trùng thành công ra ngoài hoặc gửi kết quả tìm kiếm một phần của mẫu động cho Pattern Reassembly Module (PRM) Trong trường hợp mẫu phát hiện được là một phần của mẫu động, mẫu này cần phải được xử lý và tái lắp ghép bởi PRM Trong trường hợp mẫu phát hiện được là một mẫu tĩnh hoàn chỉnh, kết quả này có thể gửi trực tiếp ra bên ngoài và xem như đã phát hiện thành công một mẫu chữ ký virus trên dữ liệu quét Đối với PRM, luồng xử lý sẽ như sau Module PRC đóng vai trò trung tâm điều phối hoạt động của PRM PRC sẽ lần lượt đọc các sự kiện từ Event Buffer và tra cứu thông tin về mẫu con được phát hiện từ Sub-pattern Metadata Thông tin về mẫu con này bao gồm: ID của mẫu động chứa mẫu con này, vị trí của mẫu con trong mẫu động, ID của mẫu con tiếp theo cùng với các ràng buộc về vị trí xuất hiện Dựa trên các thông tin này PRC sẽ tra cứu và cập nhập các bảng Valid-bit Table, Trace Metadata và quyết định xem các điều kiện để xác định mẫu chữ ký động đã đầy đủ Hoạt động và thiết kế của PRM sẽ được phân tích chi tiết hơn ở phần sau
Khối Arbiter
Như đã trình bày, hệ thống phần cứng có khả năng xử lý hai loại mẫu chữ ký virus là mẫu chữ ký tĩnh và mẫu chữ ký động Một Event từ bộ Pattern Matching Module sẽ bao gồm các thông tin sau
Control information: Thông tin điều khiển
Sub-pattern ID: định danh ID hay index của sub-pattern vừa phát hiện
Matching offset: vị trí trong buffer mà mẫu con này bị phát hiện
Control information gồm 2 bit mô tả loại sub-pattern vừa phát hiện Trên thực tế một sub-pattern có thể là một mẫu chữ ký virus tĩnh hoàn chỉnh, một phần trong mẫu chữ ký virus động hoặc cả hai Control information được mô tả như trong bảng bên dưới
Bảng 4-1 Mô tả chức năng Control Information
10 Mẫu con chữ ký động
11 Vừa mẫu con vừa là mẫu chữ ký tĩnh
Bộ Abiter sẽ dựa trên nội dung của trường Control Information để quyết định chuyển tiếp kết quả so trùng đi đâu Event từ bộ Pattern Matching Module sẽ nhận 1 trong ba giá trị 01, 10, 11 của trường Control Information Event từ bộ Pattern Reassembly Module sẽ nhận duy nhất một giá trị 00 cho trường Control Information Trường hợp 01, 11 hoặc 00 Sub-pattern ID sẽ được gửi ra ngoài và xem như là Signature
ID Trường hợp 10, 11 Sub-pattern ID sẽ được gửi cho bộ Pattern Reassembly Module để thực hiện tái lắp ghép mẫu động
Event Buffer
Event Buffer thực tế là một FiFo IP Core của Xilinx, cho phép đệm các Events để chờ xử lý Bằng cách sử dụng Event Fifo, dữ liệu trao đổi giữa Pattern Reassembly Module và Abiter có thể được đồng bộ một cách dễ dàng
Hình 4-2 Biểu đồ tín hiệu giao tiếp đọc ghi trên FIFO
Sub-pattern Metadata
Để có thể tái lắp ghép các mẫu con thành một mẫu động hoàn chỉnh, các thông tin về định danh mẫu con, thứ tự xuất hiện cùng với các ràng buộc về vị trí cần phải được chuẩn bị trước và cất giữ trong Sub-pattern Metadata (SM) SM thực chất là một bảng tra được hiện thực bằng bộ nhớ on-chip trên FPGA Nội dung của SM được trình bày trong Bảng 4-2
Một mẫu chữ ký động được biểu diễn như một danh sách liên kết các mẫu chữ ký con, mỗi mẫu chữ ký con được lưu trữ trên một dòng trong SM Sig_ID là định danh của mẫu động chứa mẫu con này, Next_ID là định danh của mẫu con tiếp theo trong danh
45 sách liên kết, m và n lần lượt là khoảng cách cận dưới và cận trên đến vị trí xuất hiện của mẫu con tiếp theo, order là vị trí của mẫu con này trong mẫu chữ ký động
Bảng 4-2 Nội dung sub-pattern metadata
Tên trường Kích thước Mô tả
Sig_ID SIG_ID_WIDTH Signature ID
Next_ID PAT_ID_WIDTH Pattern ID tiếp theo trong mẫu động m GAP_WIDTH Khoảng cách cận dưới n GAP_WIDTH Khoảng cách cận trên order ORDER_WIDTH Thứ tự pattern trong mẫu động.
Khối Trace Validate
Một Trace (theo dấu) là một định danh mẫu động đang trong quá trình tái lắp ghép và mỗi trace tương đương với một mẫu động Khi mẫu con đầu tiên của mẫu động được tìm thấy, trace tương ứng với mẫu động đó xem như valid Trace này sẽ tiếp tục valid nếu như các mẫu con tiếp theo của mẫu động này lần lượt được tìm thấy và thỏa mãn các điều kiện ràng buộc về vị trí Xét một ví dụ sau đây
Với mẫu chữ ký động:
Khi mẫu con “abc” được tìm thấy, trace tương ứng với mẫu này sẽ trở thành valid và trace này sẽ trông đợi mẫu con “def” xuất hiện với khoảng cách từ 4-6 byte so với vị trí hiện tại Giả sử tại mẫu con “def” xuất hiện tại vị trí byte thứ 5 sau đó, trace hiện tại tiếp tục valid và trông đợi sự xuất hiện của mẫu con ghij tại vị trí thứ 8 sau vị trí hiện tại Giả sử tại vị trí thứ 8 không có mẫu “ghij” xuất hiện, khi đó trace này trở thành invalid và việc tìm kiếm mẫu động này phải bắt đầu lại từ đầu với việc tìm kiếm mẫu con “abc”
Nhiệm vụ của module Trace Validate Unit (TVU) là quản lý thông tin valid của các trace TVU trên thực tế là một bảng tra được hiện thực sử dụng bộ nhớ on-chip của FPGA với độ rộng là 1 bit và độ sâu là số lượng mẫu động cần theo dấu Nếu vị trí tương ứng với mẫu động trong bảng tra có giá trị 1, điều này tương đương với trace tương ứng của mẫu động đó đang valid và ngược lại Mỗi khi mẫu con đầu tiên của mẫu động được phát hiện, vị trí tương ứng của mẫu động trong bảng tra sẽ được bật lên 1, và mỗi khi điều kiện tìm kiếm mẫu con tiếp theo không được thỏa mãn, vị trí này sẽ được tắt về 0
Việc sử dụng bộ nhớ on-chip để hiện thực TVU là một phương pháp đơn giản và tích kiệm tài nguyên Tuy nhiên phương pháp này sẽ xuất hiện vấn đề trong trường hợp xử lý các trace thuộc các file quét khác nhau Khi quét một file, có thể nhiều trace tương ứng với nhiều mẫu động được kích hoạt, và các trace này có thể vẫn còn valid cho đến khi file tiếp theo được quét Điều này có thể sẽ dẫn đến kết quả sai trong quá trình tìm kiếm mẫu động ở file tiếp theo này Đối với phần mềm, vấn đề này có thể được giải quyết bằng cách quét qua tất cả các trace và reset giá trị trong bảng tra về 0 tương đương với trạng thái invalid Tác vụ này sẽ đòi hỏi thời gian thực thi là O(n) với n là số lượng mẫu chữ ký động Tuy nhiên trên phần cứng, giải pháp này không phù hợp vì sẽ gây độ trễ O(n) mỗi khi file mới được đưa vào quét Để giải quyết vấn đề trên, luận văn đề xuất phương pháp sử dụng kết hợp nhiều bảng tra và các bảng tra này sẽ được tuần tự luân phiên sử dụng và song song reset mỗi khi file mới được đưa vào quét Mã giả mô tả giải thuật xử lý của Trace Validate Unit được trình bày như bên dưới Các bảng tra không phải bảng tra đang được sử dụng (current_trace_table) sẽ được xử reset song song Tác vụ reset_table() cần thời gian thực thi là O(n) với n là số lượng mẫu chữ ký động Với N là số lượng bảng tra được sử dụng, độ trễ của quá trình reset bảng tra mỗi khi file mới được quét là O(n/N)
Trace_Table trace_table_array[N] = new Trace_Table[N] integer current_trace_table_id = 0
Trace_Table current_trace_table = trace_table_array[current_trace_table_id] produce: Trace_Validate_Unit
47 parallel function Trace_Table_Round_Robin(is_new_file_submitted): if is_new_file_submitted: current_trace_table = trace_table_array[(current_trace_table_id +1)/N] end parallel function parallel function Reset_Table(0): if 0 != current_trace_table_id: reset_table(trace_table_array[0]) end parallel function parallel function Reset_Table(1): if 1 != current_trace_table_id: reset_table(trace_table_array[1]) end parallel function
parallel function Reset_Table(N-1): if N-1 != current_trace_table_id: reset_table(trace_table_array[N-1]) end parallel function end procedure
Với L là kích thước của file cần quét, để quá trình quét diễn ra liên tục thì điều kiện sau phải được thỏa mãn
Với số mẫu động n000, và N=4 thì kích thước file trung bình tối thiểu sẽ là
2500 bytes, và với N=8 thì kích thước file trung bình tối thiểu là 1250bytes.
Trace Metadata
Trace Metadata sẽ quản lý thông tin tức thời của trace đang được theo dõi Như trình bày ở phần trên, mỗi valid trace sẽ được theo dõi và cập nhật Khi một mẫu con tại vị trí thứ i được phát hiện và phù hợp với điều kiện ràng buộc về vị trí, thông tin về mẫu con tiếp theo và vị trí xuất hiện sẽ được cập nhật trong Trace Metadata Trace Metadata được hiện thực sử dụng bộ nhớ on-chip của FPGA với cấu trúc như mô tả trong Bảng 4-3
Bảng 4-3 Nội dung Trace Metadata
Tên trường Kích thước Mô tả
Next_ID PAT_ID_WIDTH Pattern ID tiếp theo trong mẫu động
Position OFFSET_WIDTH Vị trí kỳ vọng xuất hiện Pattern ID
Gap GAP_WIDTH Khoảng cách cận trên so với Position order ORDER_WIDTH Thứ tự pattern trong mẫu động
Các trường trong Bảng 4-3 chính là nội dung một dòng trong Trace Metadata Và địa chỉ của dòng này được chỉ định bởi ID của mẫu động đang theo dấu Nội dung các trường này sẽ được cập nhật dựa trên thông tin đọc được từ Sub-pattern metadata và thông tin từ sự kiện (Event) đọc từ Event Buffer Kích thước của các trường này có thể tùy biết trong giai đoạn hiện thực để đáp ứng với yêu cầu tập mẫu mới và sẽ được thảo luận chi tiết trong phần thử nghiệm và đánh giá.
Pattern Reassembly Controller
Pattern Reassembly Controller (PRC) là module chính điều khiển hoạt động tái lắp ghép mẫu chữ ký động PRC đứng trung gian đọc và cập nhật dữ liệu với các module khác trong Pattern Reassembly Module và do đó tốc độ xử lý của PRC sẽ ảnh hưởng trực tiếp đến tốc độ so trùng mẫu chữ ký động của toàn bộ hệ thống Bên cạnh các tác vụ truy xuất bộ nhớ (Trace Validate Unit, Trace Metadata, Sub-pattern Metadata), PRC còn thực hiện các phép so sánh và sinh ra các sự kiện thông báo Việc phụ thuộc dữ liệu giữa các module là không tránh khỏi ví dụ như để có thể kiểm tra xem mẫu con vừa xuất hiện có thuộc về một trace đang valid hay không, PRC phải đọc được địa chỉ của trace đó từ Sub-pattern metadata sau đó kiểm tra trong Trace Validate Unit Sau đó để kiểm tra xem mẫu con có thỏa mãn ràng buộc về vị trí xuất hiện hay không, PRCE cần phải đọc dữ liệu từ Trace Metadata,… Do đó để đảm bảo hoạt động liên tục của PRC, kiến trúc của PRC sẽ được thiết kế với kiến trúc pipeline
Bảng 4-4 Các trạng thái pipeline của Pattern Reassembly Controller
RE Read Event – Đọc sự kiện từ Event Buffer
LS Look up Sub-pattern – Đọc Sub-pattern Metadata
VT Validate Trace – Kiểm tra trạng thái của Trace
UV Update Trace Valid – cập nhật trạng thái Trace
RM Read Trace Metadata – đọc Trace Metadata
UM Update Trace Metadata – cập nhật Trace Metadata
PM Process Metadata – Xử lý metadata
GE Generate Event – Phát sinh sự kiện tìm thấy mẫu động Để hiểu kiến trúc pipeline của PRC trước tiên cần xem xét các tác vụ xử lý của PRC Các tác vụ này được liệt kê trong Bảng 4-4 Có 8 tác vụ trong đó có thể chia làm 3 loại
Tác vụ tính toán: RE, PM, GE
Tác vụ đọc bộ nhớ: LS, VT, BM
Tác vụ ghi bộ nhớ: UV, UM
Dựa trên tính chất phụ thuộc dữ liệu của các tác vụ, có thể chia các tác vụ vào 5 bước pipeline như trong Hình 4-3 Đầu tiên, PRC đọc thông tin sự kiện từ Event Buffer Thông tin sự kiện bao gồm thông tin điều khiển, ID của mẫu con và vị trí của mẫu con ID của mẫu con được sử dụng trong bước 2 để tra cứu Sub-pattern metadata Trong metadata của mẫu con, ID của mẫu động chứa mẫu con này được dùng như địa chỉ để tra cứu dữ liệu về trace: trạng thái valid của trace (trong Trace Validate Unit), metadata gắn với trace (trong Trace Metadata) Các thông tin về trace cùng với offset của mẫu con từ bước
1, thứ tự của mẫu con từ bước hai được xử lý tại bước 4 Dựa trên kết quả xử lý, trạng thái valid của trace (UV), metadata gắn với trace (UM) có thể được cập nhật tại bước 5 hoặc một sự kiện thông báo mẫu động đã được lắp ghép hoàn chỉnh (GE) được sinh ra
Stage 1 Stage 2 Stage 3 Stage 4 Stage 5
Hình 4-3 Thiết kế pipeline cho xử lý tái ghép mẫu động
Hoạt động của tác vụ PM có thể được mô tả bởi mã giả bên dưới Đầu tiên trạng thái valid của trace tương ứng với mẫu động được kiểm tra Nếu như trạng thái trace đang là valid, có nghĩa là mẫu đầu tiên đã xuất hiện, hiện tại đang kỳ vọng các mẫu con tiếp theo xuất hiện đung thứ tự và thỏa mãn các điều kiện ràng buộc về vị trí Các tham số sau sẽ được so sánh: ID của mẫu con trong sự kiện (pid) với ID của mẫu kỳ vọng từ Trace Metadata (sig_id.metadata.id); thứ tự của mẫu con trong sự kiện (pid.metadata.order) và thứ tự mẫu con kỳ vọng (sig_id.metadata.order); ràng buộc về vị trí xuất hiện mẫu (byte_index nằm trong khoảng quy định bởi sig_id.metadata.position và sig_id.metadata.gap) Nếu các điều kiện này được thỏa mãn, có nghĩa là mẫu con vừa xuất hiện chính là một mắt xích đúng trong mẫu động Lúc này nếu như chỉ số next_ID của mẫu con trong bảng sub-pattern metadata là một giá trị INVALID_PID (tất cả các bit là 1) thì mẫu con này chính là mẫu cuối cùng trong chuỗi các mẫu con cấu thành lên mẫu động Khi này trace hiện tại xem như đã hoàn thành và sẽ bị cấu hình về invalid, đồng thời một sự kiện thông báo mẫu động đã được phát hiện sẽ được gửi đi tại bước 5 Nếu chỉ số next_ID của mẫu con khác INVALID_PID, tức là mẫu vẫn còn các mẫu con khác cần tìm để tái lắp ghép một mẫu động hoàn chỉnh Khi này, thông tin về mẫu con tiếp theo và các ràng buộc của nó sẽ được cập nhật trong bảng Trace Metadata
Get metadata of sub-pattern pid from Sub-Pattern Metadata if (Trace_Validate(pid.metadata.sig_id) == true):
Get metadata of trace sig_id from Trace Metadata if(sig_id.metadata.next_id == pid and sig_id.metadata.order == pid.metadata.order and byte_index >= sig_id.metadata.position and byte_index sig_id.metadata.position+sig_id.metadata.gap):
Trace_Validate(pid.metadata.sig_id) = false else: if(pid.order == 0):
Trace_Validate(pid.metadata.sig_id) = true
//update trace metadata sig_id.metadata.next_id = pid.metadata.next_id sig_id.metadata.order = pid.metadata.order + 1 sig_id.metadata.position = pid.metadata.m + byte_index sig_id.metadata.gap = pid.metadata.n
Nếu các điều kiện về xuất hiện mẫu không được thỏa mãn và vị trí của sự kiện hiện tại vượt quá ngưỡng kỳ vọng của mâu con tiếp theo (byte_index > position+ gap), trace hiện tại xem như không valid nữa và trạng thái của nó sẽ được cập nhật trong Trace Validate Unit tại bước tiếp theo Ngoài nếu như mẫu con là mẫu đầu tiên thì trace tương ứng của nó (pid.order == 0) thì trace này sẽ được đánh dấu là valid, các thông tin về mẫu con kỳ vọng tiếp theo và các ràng buộc cũng sẽ được cập nhật trong Trace Metadata
Với thiết kế pipeline như vậy, một mặt việc phụ thuộc dữ liệu giữa các tác vụ được thỏa mãn, mặt khác các tác vụ có thể thực thi cùng lúc và tránh được việc chờ đợi không cần thiết Ví dụ như tại thời điểm metadata của mẫu con đang được tra cứu từ Sub-pattern Metadata (LS) sự kiện tiếp theo có thể được đọc từ Event Buffer Trong khi metadata đang được xử lý (PM) thì kết quả xử lý trước đó của PM có thể được thực thi tại bước 5
52 (UV,UM, GE) Trên lý thuyết, thiết kế pipe line này có thể tăng gấp 5 lần tốc độ xử lý bình thường khi không sử dụng kiến trúc pipeline
PHÂN TÍCH VÀ XỬ LÝ TẬP MẪU
Signature Classification
Ở bước xử lý đầu tiên, lần lượt từng mẫu virus được trích trong các tập tin cơ sở dữ liệu main.db và main.ndb (chứa dữ liệu chính của mẫu động như đã đề cập ở chương 3) Các mẫu này được phân loại thành 2 loại: mẫu tĩnh và mẫu động Bảng 5-1 thống kê chi tiết số lượng mẫu tĩnh và mẫu động trong tập cơ sở dữ liệu ClamAV
Bảng 5-1 Thống kê số lượng mẫu tĩnh và mẫu động
Mẫu tĩnh Mẫu động Số mẫu
Số lượng mẫu động thu được từ tập tin cơ sở dữ liệu của ClamAV là 9670 mẫu (phiên bản phát hành 09-2013)
Wildcard Extraction
Nhiệm vụ chính của giai đoạn này là dựa vào các ràng buộc từ phía người dùng để loại bỏ một số mẫu động không phù hợp với hệ thống Sau đó, rút trích các ký tự wildcard trong các mẫu và phân chia mẫu thành các mẫu con Các mẫu con sẽ được lưu trữ trong tập mẫu không có có chứa wildcard Sau đó, chuyển đổi các thông tin liên kết các mẫu con và các wildcard về một cấu trúc dữ liệu (metadata) và lưu trữ trong “pattern metadata”
5.2.1 Ký tự wildcard Byte-Or
Trong giai đoạn này, các mẫu virus có chứa một hay nhiều toán tử Byte-Or được triển khai thành các nẫu có thể kết hợp được như mô tả trong Hình 5-2 Các mẫu mới có thể không hoặc có chứa các toán tử wildcard khác Đối với trường hợp không có chứa toán tử wildcard khác, các mẫu này sau khi triển khai thành các mẫu tĩnh Đối với toán tử có wildcard các mẫu này sau khi triển khai thành các mẫu động, và tiếp tục quá trình trích xuất và xây dựng metadata Bảng 5-2 Chỉ ra số lượng mẫu chỉ chứa toán tử Byte-
Or và chứa toán tử Byte-Or với các toán tử khác
Hình 5-2 Triển khai Byte-Or
Bảng 5-2 Thống kê số mẫu với từng loại Byte-Or
Số mẫu chỉ chứa toán tử Byte-Or 42
Số mẫu chứa toán tử Byte-Or và các toán tử wildcard khác
Việc triển khai các mẫu có toán tử Byte-Or có thể gây ra bùng nổ số lượng mẫu
Ví dụ việc mở rộng mẫu có chứa n toán tử Byte-Or có số lượng phần tử trong mỗi toán tử là 2, sẽ sinh ra 2 n mẫu Hình 5-3 là sơ đồ thống kê số lượng Bye-Or trên một mẫu trong cơ sở dữ liệu ClamAV
Hình 5-3 Phân loại số lượng Byte-Or trong mẫu
Vì sự phát sinh số lượng mẫu lớn, nên cần có giới hạn về số toán tử Byte-Or và số lượng các phần tử trong chúng Để phù hợp với tài nguyên của phần cứng, dựa theo thống kê số lượng mẫu phát sinh thì một giới hạn được đặt ra là mẫu chỉ có tối đa 3 toán tử Byte-Or, và trong các mẫu đó sẽ loại bỏ các trường hợp có số lượng các phần tử trong Byte-Or lớn hơn 5
5.2.2 Loại bỏ trường hợp đặc biệt
Giai đoạn này loại bỏ một số lượng tương đối nhỏ các mẫu từ cơ sở dữ liệu vì các lý do khác nhau Một số mẫu bị loại bỏ có thể được xử lý một cách hiệu quả hơn bằng cách tiếp cận so trùng mẫu thay thế Một số trường hợp mẫu khác chỉ đơn giản xảy ra rất hiếm khi mà chúng không phù hợp với tài nguyên phần cứng chuyên dụng hoặc kiến trúc
Trong luận văn, một mẫu được loại bỏ nếu nó có chứa một hoặc nhiều phân đoạn đáp ứng những tiêu chí sau đây:
1 Chứa các ký tự một nửa byte
2 Các mẫu có số lượng sub-pattern lớn hơn 16
3 Các mẫu chứa bất kỳ mẫu con nào có chiều dài lớn hơn 256 byte
4 Các mẫu chứa số lượng Byte-Or lớn hơn 3 và trong các mẫu có 3 Byte-Or loại đi các mẫu có trường hợp số phần tử trong một Byte-Or lớn hơn 9
Wildcard phân mẫu chứa nó thành nhiều mẫu con, các wildcard định nghĩa một khoảng cách so trùng đối với mẫu con trước và sau nó Vì vậy, phương pháp so trùng mẫu động, đơn giản là so trùng các mẫu con và kiểm tra các ràng buộc giữa các mẫu con Phần mềm sẽ phân tách các wildcard và các mẫu con, sau đó tạo các metadata cho chúng
Ví dụ: Với mẫu P = abcdefghij{10}def
Pattern P chứa toán tử thay thế {10}, có nghĩa là một khoảng cách là 10 byte tùy ý, và sẽ được chia thành hai mẫu con:
Các ký tự wildcard còn lại, có thể chuyển đổi về dạng so trùng trong khoảng từ m đến n byte Bằng cách chuyển đổi này, hệ thống phần cứng chỉ xây dựng bộ so trùng cho một dạng wildcard ({m-n}), và sau đó có thể hỗ trợ cho toàn bộ các wildcard khác Phần này mô tả chi tiết quá trình chuyển đổi cho các dạng wildcard còn lại
Dạng wildcard {n}, so trùng sau một khoảng cách n byte, chia mẫu có chứa nó thành 2 phân đoạn, sự xuất hiện của chuỗi hex ngay sau wildcard, phải được xuất hiện sau một khoảng cách n byte sau khi chuỗi hex trước xuất hiện Nếu đoạn thứ hai đến sau n bytes hoặc đến trước n byte, thì chuỗi đầu vào sẽ không phù hợp với mẫu này Vì vậy, khi chuyển qua dạng {m-n}, các giá trị của m và n là n byte
Ví dụ: Mẫu 0401050205{4}0506030202 chuyển thành 0401050205{4-4}0506030202
Dạng wildcard {n-}, so trùng sau một khoảng cách ít nhất n byte, sự xuất hiện của chuỗi hex ngay sau wildcard, phải được xuất hiện sau một khoảng cách ít nhất n byte sau khi chuỗi hex trước xuất hiện Sau một khoảng cách n byte, bộ so trùng sẽ luôn tìm kiếm giá trị của đoạn thứ hai Vì vậy, khi chuyển qua dạng {m-n}, các giá trị của n và ∞ byte Tương tự, cho wildcard{-n}, các giá trị m và n tương ứng là 0 và n
Dạng wildcard “??”, so trùng sau khoảng 1 byte, trong cơ sở dữ liệu của ClamAV xuất hiện các trường hợp các ký tự “??” xuất hiện liên tiếp Giả sử có n ký tự “??” liên tiếp Ta có thể dễ dàng chuyển về dạng {n} và sau đó là {n-n}
Ví dụ: Mẫu 0401050205??????????0506030202??070809 chia thành 3 phân đoạn, với 2 chuỗi “??” liên tiếp nhau,
Chuỗi 1: gồm 5 ký tự “??” liên tiếp, được chuyển thành {5-5}
Chuỗi 2: gồm 1 ký tự “??”, chuyển thành {1-1}
Một ký tự wildcard “*”, giả sử a*b, có thể so trùng sau bất kỳ số lượng byte giữa hai đoạn có nghĩa là đoạn thứ 2 có thể đến bất cứ lúc nào sau khi đoạn đầu tiên xuất hiện Một khi đoạn đầu tiên được phát hiện ở đầu vào, bộ so trùng phải luôn luôn tìm kiếm đoạn thứ hai Sự chuyển đổi qua dạng so trùng trong khoảng ({m-n}), chỉ đơn giản là so trùng sau ít nhất 0 byte và nhiều nhất là ∞ byte, với 0 ít nhất, sẽ báo cho bộ so trùng rằng luôn chờ đợi chuỗi thứ hai xuất hiện Việc chuyển đổi này không xảy ra bất kỳ “false positive” nào
Các ký tự wildcard “aa[x-y]HexSig” hoặc “HexSig[x-y]aa” được thêm vào trong ClamAV nhằm mục đích tối ưu hệ thống tìm kiếm Trong đó, sẽ so trùng với 2 byte aa trước hoặc sau chuỗi HexSig, với khoảng cách là từ x đến y (y ≤ 32) Như vậy, khi chuyển về dạng {m-n}, các giá trị tương ứng là m = x và n = y
Tóm lại, tất cả các dạng wildcard có thể chuyển đổi về cùng một dạng {m,n} Bằng cách này, thuật toán để khôi phục lại các mẫu đơn giản hơn và thống nhất cho toàn bộ loại wildcard Bảng 5-3 mô tả các giá trị m và n khi chuyển đổi từng loại wildcard Giá trị vô cùng ∞ sẽ được thay thế bằng giá trị lớn nhất mà hệ thống phần cứng có thể đáp ứng Giá trị này phụ thuộc vào số lượng của tập chữ ký được triển khai trên phần cứng, được đề cập đến trong chương sau
Giá trị lớn hơn (n) Giá trị trong khoảng (m)
?? Chiều dài dãy liên tiếp các ký tự ??
Chiều dài dãy liên tiếp các ký tự ??
Fragmentation
Chiều dài của các sub-pattern có thể khác nhau đến hàng trăm ký tự Vì lý do đó, việc thực hiện các bộ lọc Bloom-Bloomier cho từng chiều dài của các mẫu con là không khả thi Điều này không những tiêu tốn quá nhiều tài nguyên bộ nhớ mà còn gây ra sự lãng phí bộ nhớ, vì có nhiều nhóm các sub-pattern có cùng chiều dài chỉ gồm có một ít các mẫu con Do đó, luận văn chia sub-pattern thành các phân mảnh (fragment), xếp các phân mảnh có chiều dài tương tự thành các nhóm riêng biệt và áp dụng các bộ BBF cho các nhóm Để khái quát hóa hệ thống, luận văn không phân tích hoàn toàn cơ sở dữ liệu mẫu con thành các fragment, luận văn triển khai một số lượng BBF cố định cho các fragment có chiều dài là 8, 16, 32, 64 và 128 ký tự Nhóm các fragment từ 8 ký tự trở lên sẽ bao gồm tất cả các sub-pattern có chiều dài từ 8 đến 15, tương tự, nhóm các fragment 16 ký tự bao gồm 16 đến 31 ký tự mẫu con, và như vậy Tất cả các fragment của mẫu con có chiều dài tương tự để đơn giản hóa quá trình xây dựng lại các mẫu con từ các fragment của nó Kết quả là, mỗi mẫu con chỉ có nhiều nhất là 2 fragment có cùng độ dài, và các fragment này có chuỗi ký tự chồng lấn lẫn nhau Nếu chia các sub-pattern thành nhiều fragment hơn nữa, thiết kế trong luận văn sẽ không có đủ bộ nhớ để lưu trữ bảng băm, vì kích thước của bảng băm phụ thuộc vào số lượng các phân mảnh [9] Việc phân mảnh được thực hiện khá dễ dàng và nhanh chóng
Ví dụ: Theo ví dụ 1, sub-pattern P1 = abcdefghij Chiều dài của sub-pattern P1 là
10, vì vậy sub-pattern này được chia thành hai các fragment có chiều dài là 8 ký tự:
Như vậy, khoảng cách giữa các fragment là 10-8 = 2 Khoảng cách có nghĩa là số lượng ký tự, được bắt đầu tính từ thời điểm fragment 0 so trùng thành công đến kết quả so trùng tiếp theo của fragment 1
Luận văn dựa theo ba phương pháp danh sách liên kết như [16] để xây dựng lại một sub-pattern từ các fragment của nó Có ba mẩu thông tin được mã hóa trong bản ghi đoạn đầu tiên: khoảng cách đến đoạn fragment thứ hai, giá trị băm của fragment thứ hai và số id của mẫu Khi một fragment đầu tiên trùng với dữ liệu đầu vào, bộ máy so trùng mẫu sẽ lưu trữ thông tin mẫu đầu tiên để so sánh với thông tin của fragment tiếp theo, nếu fragment đó trùng với dữ liệu đầu vào Nếu độ dài fragment tiếp theo, khoảng cách cũng như giá trị băm là tất cả tương đương với bất kỳ bản lưu trữ trước đó, hệ thống có thể giả định hai fragment đó thuộc về một sub-pattern
Tuy nhiên, việc thực hiện phương pháp này gặp phải khó khăn với những fragment trùng lặp Có 3 trường hợp của các fragment trùng lặp như sau:
Trường hợp 1: sub-pattern có fragment đầu tiên là duy nhất, nhưng fragment thứ hai trùng với fragment thứ hai của sub-pattern nào đó
Trường hợp 2: sub-pattern có fragment đầu tiên trùng với fragment thứ nhất của sub-pattern nào đó, nhưng fragment thứ hai là duy nhất
Trường hợp 3: fragment thứ hai của sub-pattern trùng với fragment đầu tiên của một sub-pattern khác
Tạo Metadata
Hàm băm sử dụng trong bộ so trùng mẫu đơn BBF được trình bày trong biểu thức x.x Việc thay đổi này giảm tài nguyên hiện thực trên FPGA, tuy nhiên sự phân bố khóa của hai phương pháp là như nhau
Chúng ta có thể tạo ra các hàm băm khác nhau bằng cách thay đổi giá trị ban đầu
𝐻 0 của nó Như đã đề cập trong chương 2, hai hàm băm được sử dùng để băm các giá trị vào trong cùng một bảng băm Hệ thống so trùng mẫu tĩnh cần đến 8 hàm băm, nghĩa là sinh ra 8 giá trị 𝐻 0 , bởi vì bộ BBF sử dụng 3 bit cho Bloomier và 1 bit cho Bloom
Phương pháp tìm hàm băm cho bộ lọc Bloom khá đơn giản, bởi vì chỉ cần lựa chọn giá trị 𝐻 0 thích hợp, để tạo ra một hàm băm tốt, phân phối toàn bộ các khóa trong bảng băm Chương trình sử dụng thuật toán tham lam (greedy), để tìm kiếm toàn bộ các cặp khóa thỏa mãn các ràng buộc Có hai ràng buộc chính trong việc xác nhận một hàm băm là đủ tốt:
Số lượng các fragment được băm vào cùng một vị trí trong bảng băm không được vượt quá một số cho trước
Tỷ lệ số lượng các vị trí trong bảng băm, trong đó có nhiều hơn fragment trong cùng vị trí và chiều dài của bảng băm không được vượt quá một con số cho trước
Việc xây dựng bảng chỉ số cho bộ lọc Bloomier phức tạp hơn và không phải tất cả hàm băm có thể sử dụng để xây dựng bảng băm cho bộ lọc Bloomier [11]
Luận văn làm theo các bước được giới thiệu trong [11] để xây dựng bảng chỉ mục cho Bloomier Các bước như sau:
Bước 1: Băm toàn bộ tập mẫu vào bảng băm
Bước 2: Quét toàn bộ bảng một lần để tìm khóa không phải singleton (vị trí trong bảng băm không có đụng độ nào) Sau đó, tất cả các khóa này được đưa vào stack
Bước 3: Tất cả các khóa trong stack mà không được xử lý sẽ được xem xét và gỡ bỏ khỏi các vị trí được hash (nhưng không phải từ stack)
Bước 4: lặp lại bước 2 cho đến khi toàn bộ khóa được đẩy vào khỏi stack
Bước 5: Bắt đầu từ đỉnh của stack, băm từng khóa vào bảng băm với thông tin mã hóa
5.4.2 Tính toán dữ liệu cho mỗi fragment
Dữ liệu cho các fragment sẽ được tính toán từ các sub-pattern tương ứng: Các giá trị mã hóa cho bộ lọc Bloomier (Fragment type và Unique Hash) và dữ liệu SRAM (next hash value, next distance, base ID…) Có hai trường hợp như sau:
Trường hợp 1: mẫu đơn không có bất kỳ fragment nào trùng với fragment của các mẫu đơn khác Bảng 5-4 và Bảng 5-5 chỉ ra cách gán dữ liệu cho bộ lọc Bloomier và SRAM tương ứng với từng fragment Trong trường hợp này, fragment thứ hai không có dữ liệu SRAM
Bảng 5-4 Dữ liệu mã hóa trong Bloomier của mỗi fragment
Tên trường Giá trị Fragment thứ nhất Giá trị Fragment thứ hai
Unique hash Giá trị Id của một trong hai hàm hash tạo ra vị trí singleton cho fragment (vị trí trong bảng băm không có bất cứ đụng độ nào) Vị trí này được tạo ra trong lúc xây dựng bảng băm cho bộ lọc Bloomier Vì thế, giá trị trong trường này có thể là 0x0 hoặc 0x1
Bảng 5-5 Dữ liệu lưu trữ trong SRAM của mỗi fragment
Tên trường Fragment đầu tiên
Next hash Giá trị hash duy nhất của fragment thứ hai
Next distance Khoảng cách đến đoạn fragment thứ hai
Base ID Giá trị16bits, ID của fragment trong nhóm các fragment có chiều dài bằng nhau
Trường hợp 2: Mẫu đơn có fragment thứ nhất hoặc thứ hai trùng với fragment nào đó Điểm chính yếu của cách giải quyết này là tìm tất cả các fragment trùng trong tập hợp các fragment Phương pháp “breath-first” được triển khai để tìm tất cả các phân mảnh trùng nhau trong tập các fragment, như trình bày ở mã giả bên dưới stack = NULL top = 0 bottom = 0 for each pattern in allpatterns not processed if any fragment of pattern shares with other pattern add all fragments to stack update top stop loop end if end for each while (top > bottom) pre_top = top for each fragment_stack in stack from bottom to pre_top for each fragment of pattern if fragment shares with other pattern add all fragments of other pattern to stack update top end if end for each for each pattern in allpatterns not processed if any fragment of pattern shares with fragment_stack
65 add all fragments of pattern to stack update top end if end for each end for each bottom = pre_top end while
Như đã giới thiệu ở chương 4, bộ so trùng mẫu động lưu trữ các thông tin của các mẫu trong metadata, bao gồm thông tin các mẫu con và ràng buộc giữa chúng Phần mềm sau khi rút trích các sub-pattern sẽ tiếp tục sinh ra các metadata tương ứng như đã giới thiệu trong Bảng 4-2
Giả sử ta có mẫu P = abcdfg{10}gbfdg, được lưu tại vị trí 10 trong tập mẫu Theo như phần 5.3, mẫu này được chia thành hai mẫu con abcdfg (lưu tại vị trí 5 trong tập mẫu con) và gbfdg (lưu tại vị trí 6), wildcard {10} được chuyển đổi thành {10-10} Sau quá trình này, metadata được sinh ra như Bảng 4-2 có các giá trị như sau
Medata cho mẫu con abcdfg
Sig_ID Next_ID m n order
Metadata cho mẫu con gbfdg
Sig_ID Next_ID m n order
ĐÁNH GIÁ VÀ KIỂM NGHIỆM HỆ THỐNG
Đánh giá kiến trúc hệ thống
6.1.1 Thống kê đánh giá phân tích tập mẫu Để tiện cho việc đánh giá và kiểm nghiệm hệ thống Phần này cung cấp các số liệu thống kê tập mẫu động trong tập tin main.cvd, phiên bản được phát hành 09/2013 Bao gồm 88885 mẫu tĩnh và 9670 mẫu động như trong Bảng 3-1 đã giới thiệu ở chương trước
Theo như các chương trước, các mẫu động trong ClamAV được chia thành nhiều mẫu con (các mẫu con này không chứa các ký tự wildcard) Hình 6-1 và Hình 6-2 cho thấy sự phân bố của số lượng mẫu con và chiều dài trong các mẫu động Việc phân bố này không đồng đều, như với số lượng mẫu con, chỉ tập trung chủ yếu ở quanh vị trí từ 2-6 mẫu con, thì chiều dài các mẫu con, phân bố rộng hơn từ 2-256 byte
Hình 6-1 Phân bố số lượng mẫu con trong mẫu động
Hình 6-2 Phân bố chiều dài mẫu con
Ngoài ra, như trong giới thiệu ở chương 5, các mẫu chứa ký tự wildcard Byte-Or (aa|bb|cc…), sau khi diễn giải có thể sinh ra thêm các mẫu động mới và các sub-pattern như trong Chương 5 Số lượng mẫu sinh ra phụ thuộc vào hai yếu tố: số lượng wildcard Byte-Or có trong mẫu và số phần tử thay thế trong các từng ký tự Byte-Or Giả sử một mẫu có 3 wildcard Byte-Or và có số phần tử thay thế trong từng wildcard tương ứng là 2,3 và 4 Ta có công thức tính số lượng mẫu có thể sinh ra là 2x3x4 = 24 mẫu Hình 5-3 chỉ ra phân bố số lượng Byte-Or có trong các mẫu có chứa Trong đó nhiều nhất là các mẫu có chứa 1 và 2 wildcard Byte-Or Bảng 6-1 phân loại và thống kê số mẫu chứa và số lượng mẫu có thể phát sinh sau khi diễn giải Trong đó, càng về sau số lượng mẫu phát sinh càng lớn, ví dụ như chỉ có 28 ký tự Byte-Or nhưng phát sinh hơn 268M mẫu (vượt qua nhiều lần tổng số mẫu trong cơ sở dữ liệu)
Bảng 6-1 Thống kê theo số mẫu chứa và có thể sinh ra của Byte-Or
Số lượng Byte-Or có chứa trong mẫu
Số lượng mẫu ảnh hưởng Số lượng mẫu sinh ra sau khi diễn giải
Các mẫu có 3 Byte-Or, tuy chỉ có 20 mẫu nhưng lại có thể tạo ra 200K mẫu mới Nếu thống kê số phần tử trong các mẫu này ta có biểu đồ như Hình 6-3 và Bảng 6-2
Hình 6-3 Thống kê số phần tử thay thế trong các mẫu có 3 Byte-OR
Số lượn g By te -Or
Số phần tử thay thế trong các Byte-Or
Bảng 6-2 Thống kê số lượng mẫu và mẫu con phát sinh thêm trong trường hợp 3
Lựa chọn số phần tử trong Byte-Or bé hơn hoặc bằng
Số mẫu có thể sinh ra
Số mẫu con tương ứng
Số mẫu thực tế có thể hỗ trợ
6.1.2 Hiện thực thử nghiệm hệ thống trên FPGA
Hệ thống so trùng mẫu chữ ký virus động (biểu thức chính quy) được hiện thực trên platform NetFPGA, chip FPGA Virtex 5 XC5VTX240T với 37440 slices, 11,644
Kb bộ nhớ on chip Việc tổng hợp, mô phỏng thử nghiệm, ánh xạ phần cứng, đi dây được thực hiện bởi công cụ Xilinx ISE 13.4
Như đã trình bày trong phần thiết kế hệ thống, để đảm báo tính mềm dẻo và khả cập nhật trước những thay đổi về tập mẫu chữ ký virus, các tham số mô tả kích thước
70 tập mẫu, các ràng buộc về vị trí được có thể được tùy biến trong giai đoạn hiện thực Bảng 6-3 liệt kê các giá trị được tùy biến trong phiên bản thử nghiệm này
Bảng 6-3 Giá trị các tham số trong bảng hiện thực thử nghiệm
Parameter Giá trị Mô tả
GAP_WIDTH 11 Khoảng cách giữa các mẫu con trong mẫu động
SIG_CTRL_WIDTH 2 Trường Control information trong sự kiện
SIG_ID_WIDTH 13 ID mẫu động
SIG_OFFSET_WIDTH 32 Vị trí xuất hiện mẫu động trong file
PAT_ID_WIDTH 15 ID mẫu con
PAT_OFFSET_WIDTH 32 Vị trí xuất hiện mẫu con trong file
ORDER_WIDTH 4 Thứ tự mẫu con trong mẫu động
Qua phân tích trong phần trên, số lượng mẫu con trong một mẫu động tập trung chủ yếu trong khoảng 2 đến 16 mẫu (hơn 99.56 %), Hình 6-1 Do đó kích thước trường biểu diễn thứ tự mẫu sẽ sử dụng 4 bit để mô tả (ORDER_WIDTH) Số bit dùng biểu diễn mẫu động trong phiên bản thử nghiệm này là 13 (SIG_ID_WIDTH), tương đương với khả năng hỗ trợ tối đa 2 13 96 mẫu động khác nhau (chiếm khoảng 84.75% tổng số mẫu động) Mỗi mẫu động có thể gồm tối đa 16 mẫu con, và theo lý thuyết có thể có 16*2 13 hay khoảng 3 triệu mẫu con khác nhau Tuy nhiên theo thống kê, Hình 6-1, số lượng mẫu con tập trung chủ yếu trong khoảng 2-5 và trung bình là 86.47%, do đó kích thước ID mẫu con (PAT_ID_WIDTH) được chọn là 15 Khoảng các giữa các mẫu con (GAP_WIDTH) được chọn là 11 tương đương với khoảng cách tối đa 2048
Bảng 6-4 Tài nguyên để hiện thực Pattern Reassembly Module
Tài nguyên Sử dụng Tổng cộng Tỉ lệ
Sau khi cố định các tham số hiện thực, mã Verilog của hệ thống so trùng mẫu chữ ký tĩnh được tổng hợp sử dụng phần mềm Xilinx ISE 13.4 và kết quả báo cáo về tài nguyên được sử dụng được trình bày trong Bảng 6-4 Theo đó tài nguyên phần tử logic khả lập trình (Slices, FF - FlipFlop, LUT – LookUp Table) chiếp một tỉ lệ rất ít (