Một số phương pháp phát hiện lỗi an ninh phần mềm

15:00 | 05/01/2011

Lỗi phần mềm có sự ảnh hưởng đặc biệt nghiêm trọng đối với mọi hoạt động có sử dụng sự trợ giúp của máy tính. Việc phát hiện lỗi phần mềm, đặc biệt là lỗi an ninh là một công việc nhạy cảm, đòi hỏi nhiều sự sáng tạo lẫn kinh nghiệm thực tiễn.

Bài báo này trình bày một số quan điểm về công việc phát hiện lỗi an ninh trong quá trình đảm bảo chất lượng sản phẩm và đưa ra một số phương pháp chung đã được áp dụng nhiều trong kiểm thử phần mềm cổ điển để áp dụng vào việc phát hiện lỗi an ninh, cùng với một số ví dụ  thực tế để miêu tả rõ bản chất vấn đề.
1. An ninh phần mềm và bảo đảm chất lượng phần mềm
Phần mềm là “bộ não” của một hệ thống thông tin. Một hệ thống thông tin luôn bao gồm tập hợp các công việc với mục đích xử lý thông tin. Nếu không có phần mềm, những chiếc máy tính hoặc thiết bị mạng không thể mang lại giá trị cho hệ thống thông tin vì chúng không thể “hiểu” thông tin đầu vào hay tạo thông tin đầu ra. Phần mềm chính là yếu tố làm nên sự “thông minh” của hệ thống.
Hơn nữa, sự “thông minh” này xuất hiện khắp mọi nơi trong hệ thống thông tin. Phần mềm không chỉ là những ứng dụng riêng biệt trong mỗi ngành nghề mà còn là hệ điều hành, là hệ quản lý cơ sở dữ liệu, là các ứng dụng máy chủ, là các phần sụn (firmware) nhúng trong các phần cứng, là những lệnh của bộ vi xử lý.... Nơi nào cần “trí tuệ” để xử lý dữ liệu, nơi đó có phần mềm. Điểm quan trọng nhất là phần mềm có ảnh hưởng trực tiếp đến tài sản của tổ chức, cá nhân sử dụng hệ thống thông tin. Phần mềm là “trung tâm” xử lý dữ liệu của hệ thống thông tin nên nó ảnh hưởng trực tiếp đến kết quả nhận được từ hệ thống. Kết quả cuối cùng này, cho dù là một sáng chế khoa học, hay một cuốn tiểu thuyết, thường là tài sản vô hình, có giá trị cao và mang ý nghĩa quan trọng đối với người sử dụng hệ thống. Do đó, tác động đến phần mềm sẽ gây ra các tác động trực tiếp đến tài sản.
1.1. Lỗi tính năng và lỗi an ninh
Sai sót (hay lỗi) phần mềm có thể gây thiệt hại trực tiếp đến tài sản của tổ chức, cá nhân sử dụng hệ thống, đôi khi làm phá sản toàn bộ dự án. Lỗi tính năng có thể làm dữ liệu biến nghĩa vì được xử lý sai. Nếu dữ liệu này được tiếp tục sử dụng trong các công đoạn sau nữa sẽ có thể tạo nên hiệu ứng đô- mi- nô, dẫn đến một chuỗi dây chuyền dữ liệu sai. Tuy nhiên, nhìn chung lỗi tính năng có phạm vi cục bộ, giới hạn trong ứng dụng cụ thể nào đấy, và có thể cả những ứng dụng phụ thuộc nó.



Lỗi an ninh có ảnh hưởng rộng hơn lỗi tính năng. Lỗi tính năng gây thiệt hại cho người sử dụng trong khi lỗi an ninh không chỉ gây ra thiệt hại mà còn đem lợi bất chính cho đối tượng khác. Lỗi an ninh xảy ra trong một ứng dụng có thể khiến toàn bộ hệ thống bị xâm nhập. Và nghiêm trọng hơn cả là khi bị tận dụng, lỗi an ninh có thể không biểu hiện bất kỳ dấu hiệu nào ra bên ngoài để nhận biết. Những yếu tố trên khiến cho việc đánh giá thiệt hại tài sản trở nên khó khăn bội phần vì không rõ biểu hiện, không rõ điểm xuất phát lỗi và không rõ những thành phần nào còn lỗi.
1.2. Đảm bảo chất lượng - Tính khoa học và nghệ thuật
Công tác đảm bảo chất lượng phần mềm (Software Quality Assurance) là cách tiếp cận việc đánh giá chất lượng và sự tuân theo chuẩn sản phẩm, hay quy trình một cách có kế hoạch và hệ thống. SQA bao gồm các công việc xuyên suốt quá trình sản xuất phần mềm như thu thập yêu cầu, phân tích, thiết kế, phát triển, kiểm thử và triển khai. SQA xoay quanh hai công việc chính là xác minh (liệu tổng 1 và 2 có phải là 3 hay không) và công nhận (liệu mục tiêu của chương trình có phải là tính tổng của 1 và 2 hay không) phần mềm nhằm cân - đo - đong - đếm hóa khái niệm “chất lượng”.
“Chất lượng” xét cho cùng, phụ thuộc vào người sử dụng sản phẩm. Một ứng dụng chạy đúng nhưng cần nhiều thời gian chưa chắc đã thỏa mãn ý muốn của người dùng và do đó không đạt tiêu chuẩn của họ. Ngược lại, đôi khi ứng dụng đưa ra kết quả gần đúng trong khoảng thời gian chấp nhận được lại làm người dùng hài lòng, và do đó có chất lượng.
SQA là một hoạt động đòi hỏi tính khoa học. Công tác SQA tập trung vào việc đo lường những yếu tố cấu thành chất lượng sản phẩm. Để việc xác minh và công nhận chất lượng được khách quan, thì công việc đo lường các yếu tố này phải được thể hiện thành những con số minh bạch, từ các bước thực hiện rõ ràng, lập lại được, tương tự như những thí nghiệm khoa học.
Vì “chất lượng” là một khái niệm trừu tượng và phụ thuộc nhiều vào yếu tố chủ quan, nên công tác đảm bảo chất lượng cũng mang tính chủ quan, phụ thuộc nhiều vào sự sáng tạo và tính nghệ thuật trong quá trình thực hiện. Những câu hỏi và trả lời cho các vấn đề như “tại sao chúng ta phải tập trung xác minh tính đúng đắn của hàm này hơn hàm kia” chính là sự đúc kết của kinh nghiệm làm việc.
Do đó, tương tự như chính công tác phát triển phần mềm, SQA vừa mang tính khoa học, vừa mang tính nghệ thuật.
Riêng về khía cạnh an ninh, việc phát hiện lỗi an ninh có xu hướng mang tính “nghệ thuật” bên cạnh việc  kiểm thử tính năng. Các tính năng an ninh thường ít được quy định chặt chẽ trong đặc điểm kỹ thuật của sản phẩm nên thường ít được nhớ đến khi thực hiện kiểm thử. Lý do nữa là các lỗi an ninh thường chỉ bị phát hiện trong những tình huống không lường trước. Sự nhạy bén, tinh tế trong việc lường trước những tình huống thế này chính là nghệ thuật, sự sáng tạo xuất phát từ kinh nghiệm và không thể được đào tạo rập khuôn.
2. Phát hiện lỗi an ninh
Mặc dù mang đậm tính nghệ thuật nhưng kiểm thử an ninh cũng có thể áp dụng một số phương pháp khoa học nhằm “hái trái thấp”, lược bớt những lỗi an ninh dễ mắc phải.
2.1. Phương pháp chung
Một số phương pháp phát hiện lỗi tính năng đã được nghiên cứu nhiều trong công tác SQA có thể được sử dụng một cách hiệu quả để phát hiện lỗi an ninh. Các phương pháp này áp dụng tốt nhất trong quá trình kiểm thử hộp trắng.
Dựa vào kiểu dữ liệu
Kiểu chuỗi cần chú ý đến sự tồn tại của ký tự kết thúc chuỗi (trong ngôn ngữ C), xem xét nếu chuỗi rỗng, hay dài quá mức, hoặc dài vừa đúng. Trong ví dụ 1, sau khi thực hiện hàm strcpy thì chuỗi s1 không còn ký tự kết thúc chuỗi và khi được chép qua s2 sẽ có thể gây lỗi tràn bộ đệm.


VD1: Lỗi về ký tự Kết thúc chuỗi


Kiểu số nguyên cần quan tâm đến các vấn đề về dấu (âm hay dương), về độ lớn của kiểu dữ liệu (1 byte, 2 byte, 4 byte, hay 8 byte), về giá trị ngưỡng.
Trong ví dụ 2, giá trị amount có thể là một số âm và sẽ khiến cho việc chuyển tiền từ một tài khoản thành việc thêm tiền cho tài khoản đó.
Dựa vào giá trị dữ liệu
Giá trị ngưỡng (cả ngưỡng trên lẫn ngưỡng dưới) có thể được kiểm tra bằng cách sử dụng các giá trị dữ liệu vừa trên ngưỡng, ngay đúng ngưỡng, vừa dưới ngưỡng và chú ý đến các phép so sánh có bằng (lớn hơn hoặc bằng, bằng, nhỏ hơn hoặc bằng). Trong ví dụ 3, mảng value được xác định chứa 512 ký tự và được sử dụng đúng khi thiết lập giá trị nhưng khi lấy giá trị thì khai báo quá lớn, gây tràn bộ đếm.
Vòng lặp có thể được kiểm tra tương tự như giá trị ngưỡng: xem số lần lặp (n) là một giá trị ngưỡng và kiểm tra việc lặp n+1 vòng, n vòng, n-1 vòng, 1 vòng, hoặc bỏ hẳn vòng lặp.
Trong ví dụ 4, lập trình viên đã giả định chỉ có tối đa 128 tiến trình trên hệ thống và không kiểm tra giả định đó trong quá trình chạy.



VD3: Lỗi về xác định giá trị ngưỡng       

Dựa vào hoàn cảnh sử dụng
Một số dữ liệu do người dùng cung cấp được sử dụng để tạo nên các dữ liệu đầu vào cho các hàm, các thành phần liên quan của chương trình. Trong các trường hợp đó, hoàn cảnh sử dụng phải được xem xét với các câu hỏi liên quan đến định dạng dữ liệu, cấu trúc dữ liệu, giá trị phù hợp (mặc định là cấm, hay mặc định là cho phép).



VD 4: Lỗi về giả định vòng lặp

Trong ví dụ 5, cid là một dữ liệu do người dùng cung cấp, và nó được sử dụng để tạo nên tập tin. Nếu cid có giá trị bắt đầu bằng ..\ thì sẽ khiến cho tập tin vượt ra ngoài thư mục attachment đã được chỉ định.
Dựa vào các hàm nguy hiểm


VD5: Lỗi về định dạng dữ liệu

Một số hàm trong thư viện chuẩn thiếu phần kiểm tra độ lớn dữ liệu (ví dụ như strcpy, strcat, sprintf, vsprintf), có những hiệu ứng phụ ít được để ý tới (ví dụ strtok, snprintf), hoặc rất khó để được sử dụng đúng cách (ví dụ strncpy, strncat). Việc rà soát sự xuất hiện của các hàm này trong mã nguồn phần mềm là một cách đơn giản để hạn chế lỗi an ninh.
2.2. Phương pháp mờ
Phương pháp mờ hay còn được biết đến như kỹ thuật kiểm tra sinh lỗi hoạt động bằng cách tạo ra những mẩu dữ liệu sai lệch, không lường trước, hoặc dữ liệu ngẫu nhiên và sử dụng chúng trong chương trình. Khi chương trình hoạt động sai, hoặc sinh ra lỗi thì lỗi này sẽ được ghi nhận lại.
Phương pháp này được sử dụng ngày càng nhiều hơn trong những năm gần đây vì chúng có thể được tự động hóa, triển khai hàng loạt (trên mô hình phân bố với các máy tính mạng, hoặc trên một máy tính với các máy ảo, và hoạt động rất nhanh). Phương pháp mờ giúp giảm bớt sự phụ thuộc vào người kiểm tra nhưng làm tăng tính chất may rủi của việc phát hiện lỗi.
3. Kết luận

Phần mềm đóng vai trò “bộ não” của một hệ thống thông tin và có ảnh hưởng đến dữ liệu -  một loại tài sản vô hình của tổ chức hoặc cá nhân sử dụng hệ thống đó. Lỗi phần mềm gây thiệt hại trực tiếp đến tài sản này và rất khó để phát hiện chúng, đặc biệt là những lỗi an ninh.
Công tác đảm bảo chất lượng phần mềm tập hợp những phương pháp giúp phát hiện những điểm yếu của sản phẩm phần mềm. Công tác này đòi hỏi có sự đo lường minh bạch, rõ ràng, mang tính khoa học, đồng thời cũng là sự đúc kết kinh nghiệm, sự nhạy bén và sáng tạo nghệ thuật của người thực hiện.
Mặc dù mang cả tính nghệ thuật nhưng việc phát hiện lỗi an ninh cũng có thể sử dụng một số phương pháp kiểm thử chung để lược đi những lỗi. Ngoài ra, sự xuất hiện và phát triển của những công cụ, tài liệu liên quan đến phương pháp mờ cũng góp phần thúc đẩy việc áp dụng nó trong quá trình phát hiện lỗi trong những năm gần đây .