Tổng quan nghiên cứu
Universal Serial Bus (USB) là giao thức kết nối phổ biến nhất giữa các thiết bị ngoại vi và hệ thống máy tính. Theo ước tính, hàng tỷ thiết bị di động và máy tính sử dụng USB để trao đổi dữ liệu và sạc pin. Tuy nhiên, USB cũng là một trong những kênh tấn công tiềm năng do tính chất kết nối vật lý trực tiếp và khả năng khai thác các lỗ hổng trong trình điều khiển (driver) USB. Một ví dụ điển hình là việc người dùng vô tình cắm điện thoại vào các ổ sạc công cộng chứa mã độc, dẫn đến nguy cơ bị xâm nhập hoặc hư hại phần cứng do tấn công điện áp cao. Đặc biệt, trình điều khiển USB chạy ở chế độ đặc quyền (privileged mode) nên các lỗ hổng trong driver có thể gây hậu quả nghiêm trọng.
Mục tiêu của luận văn là thiết kế và phát triển một công cụ kiểm thử mờ (fuzzer) tự động dành cho trình điều khiển USB gadget trên nền tảng Android, cụ thể là Linux kernel phiên bản 4.14 LTS, tương thích với các phiên bản Android 9, 10, 11. Công cụ này nhằm phát hiện các lỗi bảo mật và sự cố trong driver USB gadget mà không cần phần cứng đặc biệt, giúp mở rộng khả năng kiểm thử cho nhiều nhà phát triển và nhà nghiên cứu. Phạm vi nghiên cứu tập trung vào môi trường giả lập QEMU, sử dụng AFL fuzzer làm bộ sinh test case và thu thập thông tin code coverage để tối ưu hiệu quả kiểm thử.
Ý nghĩa nghiên cứu được thể hiện qua việc nâng cao độ tin cậy và bảo mật của trình điều khiển USB gadget, giảm thiểu rủi ro tấn công qua cổng USB trên thiết bị di động, đồng thời cung cấp giải pháp kiểm thử có thể mở rộng, tự động và tiết kiệm chi phí so với các phương pháp dựa vào phần cứng truyền thống.
Cơ sở lý thuyết và phương pháp nghiên cứu
Khung lý thuyết áp dụng
Luận văn dựa trên các lý thuyết và mô hình sau:
Fuzzing (Kiểm thử mờ): Phương pháp kiểm thử phần mềm bằng cách cung cấp đầu vào ngẫu nhiên hoặc biến đổi nhằm phát hiện lỗi và lỗ hổng. Fuzzer được phân loại thành mutation-based, generation-based, black-box, white-box và grey-box. AFL fuzzer là ví dụ điển hình của grey-box fuzzer, sử dụng code coverage làm thông tin phản hồi để sinh test case hiệu quả.
USB Stack trong Linux Kernel: Bao gồm các lớp từ phần cứng USB host/gadget controller, driver điều khiển thiết bị, đến USB core quản lý giao tiếp và phân phối dữ liệu. USB gadget driver là phần mềm điều khiển thiết bị USB ở phía thiết bị (gadget), khác với USB host driver ở phía máy chủ.
Code Coverage và Edge Coverage: Code coverage đo lường tỷ lệ mã nguồn được thực thi trong quá trình kiểm thử. AFL sử dụng edge coverage, ghi nhận các cạnh trong luồng điều khiển giữa các basic block, giúp phân biệt các đường đi khác nhau trong chương trình.
Mô hình kiến trúc kiểm thử: Sử dụng mô hình USB stack modification, trong đó giả lập USB host và gadget kết nối ở tầng phần mềm, không cần phần cứng thực. Hệ thống gồm các thành phần Manager, Executor, Executor Driver và Harness phối hợp để sinh test case, truyền dữ liệu, thu thập code coverage và phát hiện lỗi.
Phương pháp nghiên cứu
Nguồn dữ liệu: Luận văn sử dụng Linux kernel 4.14 LTS làm nền tảng, AFL fuzzer làm bộ sinh test case, QEMU làm môi trường giả lập. Dữ liệu thu thập gồm số lượng test case thực thi, code coverage, log kernel và các trạng thái lỗi.
Phương pháp phân tích: Phân tích hiệu suất thực thi (execution speed), độ ổn định của code coverage (code coverage determinism) qua stability score của AFL. So sánh kết quả với các công cụ fuzzing USB khác như Syzkaller, USBFuzz.
Timeline nghiên cứu: Quá trình phát triển và đánh giá kéo dài trong khoảng thời gian tương đối dài, đảm bảo tính hệ thống và chuyên sâu. Các bước gồm thiết kế kiến trúc, xây dựng môi trường giả lập, tích hợp AFL, phát triển Executor Driver, thu thập và phân tích dữ liệu.
Cỡ mẫu và chọn mẫu: Thực nghiệm được thực hiện trên trình điều khiển USB mass storage gadget driver, chạy trong môi trường giả lập QEMU trên máy Ubuntu với 2 CPU và 7.5GB RAM. Số lượng test case thực thi trong 1 giờ khoảng 48,100 test case.
Kết quả nghiên cứu và thảo luận
Những phát hiện chính
Tốc độ thực thi kiểm thử: Hệ thống đạt trung bình 13.2 test case/giây, nhanh hơn đáng kể so với các công cụ USB fuzzing hiện có như Syzkaller (2.5 exec/sec) và USBFuzz (2.6 exec/sec). Tốc độ cao nhờ không phải reset kết nối USB trong mỗi vòng kiểm thử, giảm thời gian tải và khớp driver.
Độ ổn định code coverage: Qua 10 lần đo stability score trong 1 giờ, có 7 lần đạt 100% ổn định, 3 lần còn lại giảm xuống 71%, 48% và 37%. Điều này cho thấy code coverage thu thập có độ tin cậy cao trong phần lớn trường hợp, tuy nhiên vẫn tồn tại sự không đồng nhất do môi trường thực thi không hoàn toàn giống nhau hoặc do việc đánh dấu thời điểm bắt đầu/kết thúc test case chưa hoàn hảo.
Khả năng phát hiện lỗi: Hệ thống có thể phát hiện các lỗi kernel thông qua giám sát log với các từ khóa đặc trưng như "BUG:", "WARNING:", "Kernel panic", giúp phát hiện sớm các lỗi nghiêm trọng trong driver.
Khả năng mở rộng và tự động hóa: Việc sử dụng giả lập QEMU và mô hình USB stack modification giúp hệ thống dễ dàng mở rộng quy mô kiểm thử mà không cần phần cứng đặc biệt, đồng thời tự động hóa quá trình sinh và truyền test case.
Thảo luận kết quả
Tốc độ thực thi vượt trội so với các công cụ hiện tại cho thấy phương pháp không reset kết nối USB là hiệu quả trong việc tăng số lượng test case được kiểm thử trong cùng thời gian. Tuy nhiên, điều này cũng dẫn đến sự không đồng nhất trong môi trường kiểm thử, ảnh hưởng đến độ ổn định code coverage. Việc phải thêm thủ công hai hàm đánh dấu bắt đầu và kết thúc test case trong driver là một hạn chế, gây khó khăn trong tự động hóa và có thể dẫn đến sai sót.
So với các nghiên cứu trước đây tập trung vào USB host driver, luận văn mở rộng sang USB gadget driver, một lĩnh vực ít được quan tâm nhưng ngày càng quan trọng do sự phổ biến của thiết bị di động. Việc tích hợp AFL fuzzer và thu thập code coverage trong môi trường giả lập là điểm mới, giúp giảm chi phí và tăng khả năng tiếp cận.
Dữ liệu có thể được trình bày qua biểu đồ tốc độ thực thi so sánh giữa các công cụ, bảng stability score thể hiện độ ổn định code coverage qua các lần chạy, và biểu đồ phân bố các loại lỗi phát hiện được trong quá trình fuzzing.
Đề xuất và khuyến nghị
Tự động hóa đánh dấu thời điểm bắt đầu/kết thúc test case: Phát triển phương pháp tự động xác định khoảng thời gian thực thi test case trong driver, có thể dựa trên phân tích chương trình hoặc tín hiệu kernel, nhằm nâng cao độ chính xác và giảm sai sót.
Phát triển bộ sinh test case chuyên biệt: Xây dựng bộ sinh test case riêng phù hợp với tính chất phức tạp và trạng thái của USB gadget driver, thay vì phụ thuộc hoàn toàn vào AFL fuzzer, giúp kiểm thử hiệu quả hơn với các driver yêu cầu nhiều trạng thái đầu vào.
Cải thiện giao diện người dùng: Thiết kế giao diện thân thiện, dễ sử dụng hơn cho người dùng phổ thông, giúp mở rộng đối tượng sử dụng công cụ kiểm thử.
Mở rộng hỗ trợ các phiên bản kernel và hệ điều hành khác: Nghiên cứu khả năng tương thích và mở rộng công cụ sang các phiên bản kernel mới hơn hoặc các hệ điều hành khác để tăng tính ứng dụng thực tế.
Tăng cường phân tích và xử lý kết quả: Tích hợp các công cụ phân tích tự động để phân loại, ưu tiên các lỗi phát hiện được, giúp nhà phát triển tập trung xử lý các vấn đề quan trọng trước.
Đối tượng nên tham khảo luận văn
Nhà phát triển trình điều khiển USB: Có thể áp dụng phương pháp và công cụ để kiểm thử bảo mật và độ ổn định của driver USB gadget, giảm thiểu lỗi trước khi phát hành sản phẩm.
Nhà nghiên cứu bảo mật phần mềm: Tận dụng kiến thức về fuzzing, code coverage và mô hình giả lập USB để phát triển các phương pháp kiểm thử mới hoặc mở rộng nghiên cứu về tấn công qua USB.
Các tổ chức phát triển hệ điều hành và kernel: Sử dụng công cụ để kiểm thử các thành phần USB gadget trong kernel, nâng cao chất lượng và bảo mật hệ thống.
Sinh viên và học giả ngành Khoa học Máy tính: Tham khảo luận văn để hiểu sâu về kỹ thuật fuzzing, kiến trúc USB trong Linux, cũng như cách xây dựng hệ thống kiểm thử phức tạp trong môi trường giả lập.
Câu hỏi thường gặp
Fuzzing là gì và tại sao lại quan trọng trong kiểm thử trình điều khiển USB?
Fuzzing là phương pháp kiểm thử phần mềm bằng cách cung cấp đầu vào ngẫu nhiên hoặc biến đổi nhằm phát hiện lỗi và lỗ hổng. Trong trình điều khiển USB, fuzzing giúp phát hiện các lỗi bảo mật tiềm ẩn do driver chạy ở chế độ đặc quyền, giảm nguy cơ tấn công qua cổng USB.Tại sao lại chọn AFL fuzzer cho hệ thống này?
AFL là một grey-box fuzzer phổ biến, sử dụng code coverage làm thông tin phản hồi để sinh test case hiệu quả. Nó có khả năng phát hiện nhiều lỗi với chi phí tính toán thấp hơn so với white-box fuzzer, phù hợp với môi trường giả lập và driver phức tạp.Làm thế nào để hệ thống kiểm thử không cần phần cứng đặc biệt?
Hệ thống sử dụng mô hình USB stack modification và giả lập QEMU để mô phỏng kết nối USB ở tầng phần mềm, loại bỏ yêu cầu về thiết bị phần cứng USB thực, giúp dễ dàng mở rộng và tự động hóa kiểm thử.Code coverage determinism là gì và tại sao nó quan trọng?
Code coverage determinism đo độ ổn định của thông tin code coverage khi chạy lại cùng một test case. Nó quan trọng vì đảm bảo rằng kết quả kiểm thử phản ánh chính xác hành vi của driver, giúp sinh test case hiệu quả và phát hiện lỗi chính xác.Hạn chế chính của hệ thống hiện tại là gì?
Hệ thống yêu cầu phải thêm thủ công hai hàm đánh dấu bắt đầu và kết thúc test case trong driver, gây khó khăn trong tự động hóa. Ngoài ra, việc không reset kết nối USB giữa các vòng kiểm thử có thể dẫn đến môi trường không đồng nhất, ảnh hưởng đến độ ổn định code coverage.
Kết luận
- Đã thiết kế và triển khai thành công hệ thống fuzzing tự động cho trình điều khiển USB gadget trên nền tảng Linux kernel 4.14 LTS, tương thích với Android 9-11.
- Hệ thống sử dụng AFL fuzzer kết hợp với giả lập QEMU, không cần phần cứng đặc biệt, đạt tốc độ kiểm thử 13.2 test case/giây, vượt trội so với các công cụ hiện có.
- Thu thập code coverage làm thông tin phản hồi giúp tăng hiệu quả sinh test case, với độ ổn định code coverage đạt trên 70% trong phần lớn trường hợp.
- Hệ thống phát hiện được các lỗi kernel thông qua giám sát log, góp phần nâng cao bảo mật và độ tin cậy của driver USB gadget.
- Các bước tiếp theo bao gồm tự động hóa đánh dấu thời điểm thực thi test case, phát triển bộ sinh test case chuyên biệt và cải thiện giao diện người dùng để mở rộng ứng dụng thực tế.
Khuyến khích các nhà phát triển và nhà nghiên cứu áp dụng và phát triển thêm dựa trên nền tảng này nhằm nâng cao chất lượng kiểm thử và bảo mật hệ thống USB gadget.