AN TOÀN BẢO MẬT TRONG CÔNG NGHỆ THÔNG TIN AN TOÀN PHẦN MỀM – LỖI PHẦN MỀM.An toàn thông tin là sự cân bằng của 3 mục tiêu: Bí mật (confidentiability), toàn vẹn (Intergrity), và sẵn dùng (availability).Bí mật (Confidentiability): tài sản chỉ được truy nhập bởi những người có quyền.Toàn vẹn (Intergrity): tài sản chỉ được tạoxóasửa đổi bởi những người có quyền Sẵn dùng (Availability): tài sản sẵn sàng để đáp ứng sử dụng cho những người có quyền
Trang 1TRƯỜNG ĐẠI HỌC BÁCH KHOA HÀ NỘIVIỆN CÔNG NGHỆ THÔNG TIN VÀ TRUYỀN THÔNG
AN TOÀN BẢO MẬT TRONG CÔNG NGHỆ THÔNG TIN
AN TOÀN PHẦN MỀM – LỖI PHẦN MỀM
Giáo viên hướng dẫn: TS Trần Đức Khánh
Học viên thực hiện : Trương Thảo Nguyên
Vũ Đình PhúNguyễn Hồng Tâm
Đỗ Ngọc Phục
Lê Gia Vĩnh
HÀ NỘI 05 – 2013
Trang 2Mục lục
Mục lục i
1 Tổng quan về an toàn phần mềm 1
1.1 Khái niệm an toàn phần mềm 1
1.2 Lỗi phần mềm 1
2 Một số lỗi phần mềm thường gặp 2
2.1 Lỗi tràn bộ đệm 2
2.1.1 Tổng quan về lỗi tràn bộ đệm 2
2.1.2 Một số ví dụ thực tế về tràn bộ đệm 3
2.1.3 Bản chất của lỗi tràn bộ đệm 4
2.2 Lỗi không đầy đủ 6
2.2.1 Tổng quan về lỗi không đầy đủ 6
2.2.2 Ví dụ thực tế về lỗi không đầy đủ 7
2.2.3 Bản chất của lỗi không đầy đủ 8
2.3 Lỗi đồng bộ 8
2.3.1 Tổng quan về lỗi đồng bộ 8
2.3.2 Ví dụ thực tế về lỗi đồng bộ 9
2.3.3 Bản chất của lỗi đồng bộ 10
3 Các biện pháp an toàn phần mềm 10
3.1 Kiểm thử phần mềm 10
3.2 Kiểm định hình thức 12
3.2.1 Kiểm định mô hình 12
3.2.2 Suy diễn logic 13
3.3 Lập trình an toàn 16
Tài liệu tham khảo A
Trang 31 Tổng quan về an toàn phần mềm
1.1 Khái niệm an toàn phần mềm
An toàn thông tin là sự cân bằng của 3 mục tiêu: Bí mật (confidentiability), toàn vẹn(Intergrity), và sẵn dùng (availability)
- Bí mật (Confidentiability): tài sản chỉ được truy nhập bởi những người có quyền.
- Toàn vẹn (Intergrity): tài sản chỉ được tạo/xóa/sửa đổi bởi những người có quyền
- Sẵn dùng (Availability): tài sản sẵn sàng để đáp ứng sử dụng cho những người có quyền
Hình 1: Các yếu tố trong an toàn thông tin
Đứng từ góc nhìn của người lập trình viên, việc xác định được một phần mềm, một thànhphần phần mềm là đảm bảo được tính an toàn thông tin là việc xác định phần mềm có đảm bảođược 3 đặc tính trên một cách cân bằng nhất hay không
1.2 Lỗi phần mềm
Có một sự thực là phần mềm nào được làm ra cũng có lỗi Lỗi phần mềm có nhiều loại Cónhững lỗi thông thường, không ảnh hưởng đến tính an toàn của phần mềm Có những lỗi lại gâyảnh hưởng nghiêm trọng, có thể bị kẻ xấu lợi dụng để khai thác Đây là những lỗi phần mềmkhiến cho một hay một vài tính chất kể trên bị vi phạm
Trang 4Hình 2: Một số ví dụ về lỗi phần mềm
Hình trên là một số ví dụ về lỗi phần mềm Code injection là loại lỗi có thể khiến kẻ xấu lợi
dụng để chèn mã độc, qua đó thực thi mã độc, chiếm quyền điều khiển hoặc thực hiện các thaotác trái phép vốn không đủ thẩm quyền để thực hiện Nhóm lỗi này vi phạm tính toàn vẹn và tínhbảo mật của hệ thống
Ping of death là một hình thức tấn công từ chối dịch vụ, tấn công vào phần mềm ở web
server Đây là loại tấn công gửi một số các gói tin ping message có phần nội dung rất lớn tới webserver dựa trên giao thức SMCP Phần mềm ở server khi nhận được gói tin này sẽ xử lý bị lỗigây đổ vỡ chương trình Từ đó người dùng hợp lệ không truy nhập được vào tài nguyên cần thiết.Lỗi này vi phạm tính sẵn dùng
WebDav là một extension của phần mềm IIS – server của MS) Từng bị lỗi và bị khai thác,
khiếm chiếm quyền điều khiển server Làm mất tính bí mật và toàn vẹn
Có thể thấy là nhiều loại lỗi an tòan phần mềm khác nhau, tuy nhiên trong bài trình bày nàychỉ tập trung vào 3 loại lỗi phần mềm cổ điển và thường gặp là :
- Lỗi tràn bộ đệm
- Lỗi không đầy đủ
- Lỗi đồng bộ
2 Một số lỗi phần mềm thường gặp
2.1 Lỗi tràn bộ đệm 2.1.1 Tổng quan về lỗi tràn bộ đệm
Lỗi tràn bộ đệm có thuật ngữ tiếng Anh là “Buffer Overflow Bộ đệm được định gnhĩa là một
vùng nhớ liên tục có kích thước giới hạn Bộ đệm thường dùng trong C là một ảng Bộ đệm đượcsử dụng để lưu trữ các giá trị tạm thời của một xâu phục vụ cho quá trình xử lý
Tràn bộ đệm được hiểu một cách đơn giản là việc sao chép một đoạn dữ liệu có kích thướclớn vào một bộ đệm có kịch thước nhỏ mà không thực hiện thao tác kiểm tra dẫn tới vùng nhớphía sau bộ đệm bị ghi đè, vùng nhớ này có thể lại là một bộ đệm khác hoặc là vùng nhớ của hệthống Hậu quả của quá trình này là làm cho chương trình họat động không chính xác hoặc bị đổvỡ
Lỗi tràn bộ đệm có thể bị kẻ xấu khai thác để thực hiện những mục đích xấu Kẻ xấu haòntoàn có thể chèn mã lệnh vào một chương trình có nguy cơ bị tràn bộ đệm và thực thi mã lệnh
đó Hầu hết các virus hay sâu phát tán trên diện rộng đều khai thác theo lỗi này Nó có thể chủđộng phát tán mà không cần sự can thiệp của người dùng (giống như virus lây file thường thựchiện là cần có sự thao tác của người dùng) Kẻ xấu khi đã khai thác được lỗi này có thể thực hiệnrất nhiều thao tác khác nhau như mở cổng để chiếm quyền điều khiển và điều khiển từ xa, cài đặt
Trang 5một backdoor lên server, đặt phần mềm gián điệp Trojan hay cài keylogger để lấy cắp tài khoảncủa người dùng
Phạm vi ảnh hưởng của lỗi tràn bộ đệm tùy thuộc vào quyền của người dùng đăng nhập vào
hệ thống Có trường hợp kẻ xấu tuy khai thác đuợc lỗi này những không làm được gì nhưng cũng
có những trường hợp hậu quả là vô cùng nghiêm trọng Ví dụ các dịch vụ hệ thống như RPC –Remote ProcedureCalls là các idchj vụ quan trọng của hệ thống NT của window Các dịch vụnày được chạy tự động dưới quyền của user SYSTEM – một user ẩn của hệ thống có quyền caotrong hệ điều hành Nếu dịch vụ này bị đổ vỡ, hệ thống sẽ ngừng hoạt động
Bộ đệm có hai cách tổ chức lưu trữ đó là trên stack (dùng để lưu các biến tĩnh) và heap (lưucác biến được cấp phát động thông qua con trỏ) Do đó tràn bộ đệm cũng có hai loại khai tháckhác nhau:
- Tràn stack:
o Ghi đè lên đia chỉ trả về của hàm: Đây là một trong những kĩ thuật cơ bản nhất củatràn bộ đệm Ý tưởng của phương pháp khai thác này đó là ghi đề lên địa chỉ trả vềcủa hàm nằm trong stack Trong trường hợp lý tưởng, hàm thay vì trở về lệnh tiếptheo sau lời gọi hàm, nó sẽ nhảy tới mã lệnh mà kẻ xấu mong muốn, qua đó thực hiệnđoạn mã xấu đó
o Ghi đè lên SEH(Structured Exception Handling) SEH là cấu trúc quản lý exceptiontrong window Nó chứa các con trỏ trỏ tới các hàm xử lý exception khi có exceptionxảy ra Ví dụ như thông báo ngoại lệ này lên màn hình Kĩ thuật khai thác này sẽ cốgắng ghi đè lên các con trỏ này để trỏ tới một hàm thực thi xấu và gây ra exceptiontương ứng Qua đó thực hiện được đoạn mã thực thi xấu
- Tràn Heap: Tràn heap là kĩ thuật khai thác khó hơn và ở mức độ cao hơn Một số kĩ thuậthiện nay khai thác bao gồm ghi đè lên con trỏ trỏ tới hàm RtlEnterCriticalSection trong PEBhay ghi đè lên Unhanded Exception Handler
Trong phạm vi của bài viết, nhóm chỉ xin trình bày vào kĩ thuật cơ bản nhất là Ghi đè lên địachỉ trả về của hàm trong tràn stack
2.1.2 Một số ví dụ thực tế về tràn bộ đệm
Lỗi tràn bộ đệm được khai thác trên diện rộng và được công bố hàng ngày trên các trangwebsite bảo mật như milworm.com, secunia.org, security focus… Các virus hay sâu muốn pháttán trên diện rộng thường sử dụng cách này
Sâu Blaster còn được gọi là Lovsan hay Lovesan được phát tán vào hồi tháng 8 năm 2003,trên các hệ thống máy chạy hệ điều hành Windows XP và Windows server 2000 của Microsoft
Nó được phát hiện vào ngày 11/08/2003 và có tốc độ lây nhiễm tăng dần đến đỉnh điểm vào ngày13/08/2003 Mục đích của sâu này là tấn công từ chối dịch vụ trang web windowsupdate.com.Sâu này lợi dụng lỗ hổng tràn bộ đệm trong giao thức DCOM RPC để phát tán [5]
Trang 6Một ví dụ khác của lỗi tràn bộ đệm là lỗ hổng trong chức năng Save As của Google Chromephiên bản 0.2.1.149.27 Đây là một trong những phiên bản đầu tiên của Google Chrome đuợcđưa ra thị trường vào tháng 9 năm 2008 Tuy nhiên phiên bản này tồn tại lỗ hổng tràn bộ đệm khisave một văn bản rất lớn Kẻ xấu có thể lợi dụng chèn mã độc vào những trang website để chúngđược thực hiện khi người dùng Save những trang web này về máy của mình Lỗi này được LêĐức Anh – một sinh viên của trường đại học Bách Khoa Hà Nội khi đó phát hiện ra Hình dưới
mô tả thông tin về lỗi này được công bố trên SecurityFocus.com
Hình 3: Mô tả lỗi tràn bộ đệm trên GoogleChrome
2.1.3 Bản chất của lỗi tràn bộ đệm
Xét một ví dụ C đơn giản như sau:
Bây giờ chúng ta xem xét bộ nhớ được tổ chức như thế nào Trên máy tĩnh x86(32 bit) cácthanh ghi có độ dài 32bit CPU có thể quản lý được tối đa $GB RAM địa chỉ Trong đó 2GB địachỉ cao từ 80000000 đến FFFFFFFF sẽ được dành cho nhân của hệ điều hành và các cấu trúc dữliệu duy trì họat động của hệ thống Vùng dữ liệu từ 00000000 đến 7FFFFFFF sẽ dành cho cácứng dụng phần mềm sử dụng để cư\gyứa nội dung của file exe được nạp vào, stack của chươngtrình chứa các biến được khai báo tính Khi một chương trình được chạy, hệ thống sẽ nạp tòan bộ
Sep 05 2008: Google Chrome 0.2.149.27 'SaveAs'
Function Buffer Overflow Vulnerability
Discoverer: Le Duc Anh - SVRT – Bkis
Description : The vulnerability is caused due to a
boundary error when handling the "SaveAs" function
On saving a malicious page with an overly long title
(<title> tag in HTML), the program causes a stack-based overflow
and makes it possible for attackers to execute arbitrary code on
users' systems
Nguồn:
http://www.securityfocus.com/archive/1/496042
Sep 05 2008: Google Chrome 0.2.149.27 'SaveAs'
Function Buffer Overflow Vulnerability
Discoverer: Le Duc Anh - SVRT – Bkis
Description : The vulnerability is caused due to a
boundary error when handling the "SaveAs" function
On saving a malicious page with an overly long title
(<title> tag in HTML), the program causes a stack-based overflow
and makes it possible for attackers to execute arbitrary code on
users' systems
Nguồn:
http://www.securityfocus.com/archive/1/496042
Trang 7file nhị phân vào vùng địa chỉ bắt đầu là 00400000 Hình dưới thể hiện tổ chức bộ nhớ trong hệthống.
Hình 4: Tổ chức của bộ nhớ
Tiếp theo, chúng ta tìm hiểu đến quá trình gọi hàm của một chương trình trong hệ thống.Hình dưới mô tả quá trình này Giả sử một chương trình được nạp vào trong bộ nhớ và đang thựchiện đến câu lệnh thứ 5 Trong hệ điều hành có thanh ghi IP (Instruction pointer) là thanh ghichứa địa chỉ của câu lệnh được thực hiện tiếp theo Khi câu lệnh thứ 5 được thực hiện Hệ điềuhành sẽ cấp phát một stack frame mới để thực hiện cho hàm fn được gọi Trong frame này cómột số thành phần tuy nhiên quan trọng nhất là ba thành phần:
Trang 8Hình 5: Quá trình gọi hàm của chương trình
- RET: return value: chứa địa trả về sau khi hàm fn được thực hiện xong
- Lưu lại SP (Stack pointer): SP là con trỏ sử dụng trong stack Việc lưu lại SP giúp việc quảnlý bộ nhớ tĩnh trong stack của hàm gọi chính xác khi hàm fn thực hiện xong
- Buffer: Bộ đệm được cấp phát cho các biến trong hàm fn (tham biến, tham số)
Bên cạnh việc cấp phát một stack frame, thanh ghi IP cũng chứa nội dung là địa chỉ đầu tiêncủa đoạn bộ nhớ chứa nội dung hàm fn Tiếp đó hàm fn được thực hiện Khi trả kết quả về, Stackframe được cấp phát sẽ được giải phóng Thanh ghi IP sẽ lấy giá trị của RET, các thanh ghi SPđược phục hồi Từ đó chuẩn bị thực hiện câu lệnh tiếp theo là câu lệnh thứ 6 trong chương trìnhchính
Hình 6: Khai thác tràn bộ đệm – ghi đè địa chỉ trả về
Lợi dụng cách thức họat động trên, kẻ xấu có thể ghi vào nội dung của buffer với kích thướcrất lớn khiến bộ đệm bị tràn sao cho tại đoạn nhớ chứa RET sẽ bị ghi đè lên giá trị trùng với địachỉ của đoạn mã độc Như vậy, khi hàm fn được thực hiện xong, thanh ghi IP sẽ nhận giá trị là
Trang 9địa chỉ của đoạn mã độc thay vì địa chỉ của câu lệnh thứ 6 tại hàm gọi chương trình Câu lệnhtiép theo được thực hiện sẽ là câu lệnh đầu tiên của đoạn mã độc.
2.2 Lỗi không đầy đủ
2.2.1 Tổng quan về lỗi không đầy đủ
Lỗi không đầy đủ có thuật ngữ tiếng Anh là “Incomplete Mediation Lỗi không đầy đủ là lỗi
liên quan chặt chẽ đến các giá trị đầu vào của chương trình phần mềm và thường được địnhnghĩa bởi những người dùng bất kì (khó có thể tin tưởng được) Các ứng dụng web là một trongnhững ví dụ điển hình của nhóm chương trình phần mềm này Ví dụ, khi được yêu cầu nhập mộtđịa chỉ email, người dùng có thể nhập các giá trị như iang#cas.aaaa.ca Đây không phải là mộtđịa chỉ email hợp lệ Một chương trình phần mềm cần phải kiểm tra để chắc chắn rằng ngườidùng đã nhập giá trị đầu vào là hợp lệ Từ đó, những yêu cầu của người dùng mới có ý nghĩa làđược thực hiện một cách đúng đắn Quá trình kiểm tra này gọi là mediation
Lỗi không đầy đủ xảy ra khi mà một ứng dụng phần mềm chấp nhận những giá trị đầu vàokhông chính xác (về mặt kiểu dữ liệu, định dạng dữ liệu, nội dung vv), Qua đó chương trìnhphần mềm này sẽ thực hiện không chính xác Ví dụ như khi được yêu cầu nhập số điện thoại,người dùng thay vì nhập số 5198864567 thì lại nhập giá trị 519-886-4567 Đây là một giá trịnhập vào có ý nghĩa nhưng lại không đúng định dạng Có thể khiến cho phần mềm xử lý khôngchính xác[11]
Trong lỗi không đầy đủ chúng ta tập trung tìm hiểu vào các giá trị đầu vào không chính xácbao gồm:
- Không đúng định dạng: DOB (day of born): 1980-04-31
- Không có ý nghĩa: DOB nhận giá trị 1876-10-12 Một người đang sống hiện tại không thể cóngày sinh vào năm 1876
- Không đồng nhất với các giá trị khác
Do đó, trong thực tế, để phòng chống lỗi không đầy đủ, đặc biệt với các phần mềm nền web,chúng ta phải áp dụng kiểm tra giá trị của biến tại cả hai phía client và server Chương trình phảikiểm tra đối với các dữ liệu được nhập bởi người dùng Bên cạnh đó chương trình phải kiểm traviệc người dùng có điều chỉnh dữ liệu hay không đối với các trạng thái được người dùng lưu lại
2.2.2 Ví dụ thực tế về lỗi không đầy đủ
Xét một ví dụ đơn giản:
Trang 10Error(“length too large”)
dữ liệu bị sai do quá trình truyền tin trên mạng Khi đó câu lệnh memcpy sẽ luôn được thựchiện Khi này len được ép kiểu sang hành số nguyên không dấu thì một số âm sẽ thành một sốnguyên rất lớn Do đó chương trình sẽ thực hiện sai, thậm chí hệ thống có thể đổ vỡ
Xét một ví dụ khác trong thực tế Things.com là website từng mắc lỗi này [7] trong một linkđặt hàng như sau:
Link đặt hàng trên things.com
2.2.3 Bản chất của lỗi không đầy đủ
Như đã trình bày trong hai phần trên, lỗi không đầy đủ về bản chất là không kiểm tra các giá trị đầu vào một cách hợp lý Lỗi không đầy đủ xảy ra khi mà một ứng dụng phần mềm chấp nhậnnhững giá trị đầu vào không chính xác (về mặt kiểu dữ liệu, định dạng dữ liệu, nội dung vv) Lỗi không đầy đủ có thể phòng chống bằng việc kiểm tra kĩ tất cả các giá trị đầu vào có phù hợp với yêu cầu của hàm được gọi hay không
2.3 Lỗi đồng bộ
2.3.1 Tổng quan về lỗi đồng bộ
Lỗi đồng bộ (Synchronization), trong lĩnh vực phần mềm còn được gọi là TOCTTOU (time
to check to time of use), là một lớp lỗi phần mềm gây ra bởi sự thay đổi hệ thống giữa việc kiểmtra (checking) một điều kiện nào đó (ví dụ như một chứng chỉ bảo mật) và việc sử dụng các kếtquả kiểm tra đó