Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 20 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
20
Dung lượng
1,17 MB
Nội dung
10/23/2019 LOGO www.themegallery.com Lập trình an tồn (SECURE PROGRAMMING) Nội dung Lập trình an tồn Tổng quan lập trình an tồn Tràn đệm Kiểm sốt truy nhập Mã hóa thơng tin Mã hóa đối xứng Giới thiệu chương trình Lập trình an tồn Tên học phần: Lập trình an tồn (secure programming) Tồng số tiết: 30 tiết lý thuyết, 30 tiết thực hành (bài tập nhóm, thảo luận, đồ án) Nơi dụng chương trình: chương Thực chương trình Lập trình an tồn Sinh viên nghiên cứu tài liệu Lên lớp lý thuyết (30 tiết, 10 buổi) Thực hành: làm tập nhóm, thảo luận, báo cáo (30 tiết) Mã hóa cơng khai Hàm băm xác xác thực thông điệp 10/23/2019 Đánh giá Tài liệu tham khảo Lập trình an tồn Lập trình an tồn Điểm chun cần+ thảo luận, báo cáo tập nhóm: 40% [1] Bài giảng Lập trình an toàn, Ths Lương Ánh Hoàng Điểm thi cuối kỳ: 60% [2] Giáo trình mã hóa thơng tin, PGS Dương Anh Đức, TS Trần Minh Triết, ĐHKHTN TP Hồ Chí Minh [3] Secure Programming CookBook, John Viega and Matt Messier [4] Writing Secure Code, Michael Howard, Devid LeBlanc Chương LOGO www.themegallery.com Lập trình an tồn Nội dung Lập trình an tồn 1.1 Tầm quan trọng an tồn - bảo mật hệ thống 1.2 Hướng tiến trình phát triển an toàn – bảo mật hệ thống phần mềm 1.3 Các nguyên tắc an toàn – bảo mật phần mềm Tài liệu tham khảo: Writing Secure Code , Michael Howard, Devid LeBlanc 1.4 Các mơ hình cơng, đe dọa tính an tồn – bảo mật phần mềm 10/23/2019 1.1 Sự cần thiết hệ thống phải an tồn – Lập trình an tồn bảo mật Một hệ điều hành coi “an toàn” đảm bảo ba yếu tố chính: Confidentiality (tuyệt mật), Integrity (toàn vẹn) Availability (sẵn sàng) 1.1 Sự cần thiết hệ thống phải an toàn – Lập trình an tồn bảo mật Phần mềm có chất lượng phải phần mềm an toàn tin cậy Để hệ thống an tồn địi hỏi nhiều công sức tất giai đoạn phát triển phần mềm, giai đoạn lập trình Những sai lầm việc lập trình gây ảnh hưởng tới tính an tồn hệ thống 1.1 Sự cần thiết hệ thống phải an tồn – Lập trình an tồn bảo mật Một sản phẩm phần mềm khơng an tồn, có lỗ hổng bảo mật chi phí khắc phục, vá lỗi vô đắt Một số xu hướng cho an tồn, bảo mật lập trình kỹ thuật phần mềm tương lai: Song hành phát triễn phần cứng công nghệ phần mềm Hội thảo, hợp tác lực lượng lãnh vực an toàn, bảo mật 1.1 Sự cần thiết hệ thống phải an tồn – Lập trình an toàn bảo mật Đẩy mạnh giáo dục an toàn bảo mật Xác định trọng tâm an tồn, bảo mật phịng chống loại cơng theo thời điểm thích hợp Sự cơng phá hoại bảo vệ; an tồn phần mềm song hành phát triển ngày tin vi, phức tạp nâng cao - Nguyên lý 1: phải bảo vệ an tồn tất điểm, cơng chọn điểm yếu - Nguyên lý 2: Tổ chức bảo vệ an toàn sở hiểu biết công; công sở tìm lỗ hõng an tồn bảo mật 10/23/2019 1.1 Sự cần thiết hệ thống phải an tồn – Lập trình an tồn bảo mật 1.2 Xu hướng tiến trình phát triển an Lập trình an toàn toàn bảo mật phần mềm - Nguyên lý 3: Tổ chức bảo vệ phải thường xuyên, liên tục; công tùy ý - Nguyên lý 4: Tổ chức bảo vệ phải “đúng luật’; cịn cơng “chơi bẩn” Cải thiện, phát triển an tồn tất pha quy trình phần mềm: từ vấn, thiết kế, cài đặt pha test kiểm tra Tăng cường tuyên truyền, giáo dục an tồn bảo mật thơng tin Thiết kế (tin cậy) an tồn sản phẩm tạo (phần mềm) có giá trị giãm chi phí Ngược lại, thiết kế sai, khơng an tồn chi phí khắc phục, sửa chữa, bảo trì vơ tốn 1.2 Xu hướng tiến trình phát triển an Lập trình an tồn tồn bảo mật phần mềm nguyên tắc an tồn bảo mật Phần mềm có chất lượng phần mềm an tồn, code có chất lượng code an toàn Pha kiểm thử (test) an toàn quan trọng cho chất lượng phần mềm Kiểm thử phải kiểm chứng phần mềm khơng có lỗi, khơng thể bị cơng (an tồn) Ngồi kiểm thử cịn phải kiểm chứng an toàn trước lỗi (lỗ hỏng) phát sinh xu hướng công tương lai a Chiến lược SD3: thiết kế an toàn, cài đặt mặc định an toàn, chuyển giao huấn luyện an toàn b Các nguyên tắc an toàn bảo mật: Học từ lỗi, sai lầm Cực tiểu hóa bề mặt cơng Phịng thủ, bảo vệ theo chiều sâu Phân quyền đặc quyền Sử dụng an tồn mặc định Ln giả thuyết hệ thống ngồi khơng an tồn Có kế hoạch cho thất bại Ln chỉnh lại cho lỗi an toàn bảo mật Lập trình an tồn 10/23/2019 Mơ hình đe dọa an tồn bảo mật Lập trình an tồn Thiết kế an tồn thơng qua mơ hình đe dọa an toàn bảo mật Các kỹ thuật an toàn – bảo mật phần mềm Xác thực: tiến trình, yếu đảm bảo tính tồn vẹn kiểm chứng tính tồn vẹn tiến trình khác Có nhiều giao thức xác thực hệ điều hành window Có giao thức xác thực xây dựng phần mềm, số mà người sử dụng thực xác thực theo yêu cầu OS Cơ có bước xác thực là: o Xác thực o Xác thực theo danh sách LOGO www.themegallery.com Lập trình an tồn Tràn đệm (Buffer overun) Mơ hình đe dọa an tồn bảo mật Lập trình an tồn o Dạng thức (mẫu) xác thực bản: khơng có dạng thức chung Có thể tham khảo qua đoạn code xác thức ASP để đọc username password: cần hạ thấp quyền trước thực Tiến trình kiểm tra real user id, real group id lệnh getuid (), getgid() Đây đặc quyền kế thừa từ tiến trình cha Tiến trình kiểm tra effective user id effective group id lệnh geteuid() getegid() Đây thường user id có đặc quyền cao (do khởi chạy từ super user, bit setuid bật) 16 10/23/2019 3.3 Hạ thấp quyền truy nhập Chương tiến trình Lập trình an tồn Tiến trình từ bỏ đặc quyền việc thiết lập group real user id qua lệnh: setgroups(): Thiết lập lại nhóm tiến trình setegid(): Thiết lập lại effective group id tiến trình seteuid(): Thiết lập lại effective user id tiến trình 3.4 ChươngXóa file an tồn Lập trình an tồn Một vài mẫu sử dụng static unsigned char single_pats[16] = {0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88, 0x99, 0xaa, 0xbb, 0xcc, 0xdd, 0xee, 0xff }; static unsigned char triple_pats[6][3] = {{0x92, 0x49, 0x24}, {0x49, 0x24, 0x92}, {0x24, 0x92, 0x49}, {0x6d, 0xb6, 0xdb}, {0xb6, 0xdb, 0x6d}, {0xdb, 0x6d, 0xb6 }}; 3.4 Chương Xóa file an tồn Lập trình an tồn Thơng thường, file sau xóa hệ điều hành đánh dấu xóa, nội dung chưa hoàn toàn bị loại bỏ đĩa Giải pháp Ghi đè thông tin khác nhiều lần lên đĩa Ghi đè liệu ngẫu nhiên nhiều lần lên đĩa Ghi đè sử dụng mẫu định sẵn lên đĩa Sau chu kỳ ghi, sử dụng fsync để đồng với đĩa, vơ hiệu hóa chế cache Hoặc lệnh fflush() sử dụng thư viện C 3.5 Hạn chế quyền truy nhập Chương file Lập trình an tồn Unix/Linux sử dụng umask cho tiến trình để vơ hiệu hóa vài bit tiến trình tạo file Hàm fopen, open ln tạo file với quyền 666 Giả sử tiến trình muốn tạo file với quyền 666: requested_permissions = 0666; actual_permissions = requested_permissions & ~umask( ); Ứng dụng thay đổi umask hàm umask() trước thực lời gọi tạo file #include #include mode_t umask(mode_t mask); 17 10/23/2019 Chương 3.6 Khóa file Lập trình an tồn Tiến trình muốn kiểm sốt truy nhập phần file hay toàn file để tránh xung đột có nhiều tiến trình truy nhập file Unix/Linux cung cấp chế khóa mềm: Mọi tiến trình có quyền giành khóa thao tác file, nhiên khơng phải tiến trình tuân thủ theo khóa phá hỏng liệu tiến trình khác Windows thực vấn đề tốt khóa cứng Có hai loại khóa: Chương 3.6 Khóa file Lập trình an tồn Shared Lock: Cho phép tiến trình khác (kể tiến trình giành khóa) đọc khơng ghi vào phần khóa file Exclusive Lock : Cấm tất tiến trình khác khơng đọc hay ghi vào phần khóa file Tiến trình giành khóa có quyền đọc ghi vào file Các hàm khóa file Windows LockFile, UnlockFile: Khóa mở khóa đồng bộ, khơng trở đến giành khóa mở khóa LockFileEx, UnlockFileEx: Khóa mở khóa đồng bất đồng Chương 3.6 Khóa file Lập trình an tồn Shared Lock: Cho phép tiến trình khác (kể tiến trình giành khóa) đọc khơng ghi vào phần khóa file Exclusive Lock: Cấm tất tiến trình khác khơng đọc hay ghi vào phần khóa file Tiến trình giành khóa có quyền đọc ghi vào file Các hàm khóa file Windows LockFile, UnlockFile: Khóa mở khóa đồng bộ, khơng trở đến giành khóa mở khóa LockFileEx, UnlockFileEx: Khóa mở khóa đồng bất đồng Chương 3.6 Khóa file Lập trình an tồn Khóa file xác định lúc tạo lập/truy nhập file thông qua hàm CreateFile Đoạn chương trình sau mở file để đọc với chế độ Shared Lock char buff[1024]; DWORD bytesRead = 0; HANDLE fileHandle = NULL; fileHandle = CreateFile(L"C:\\SecureProgramming\\Test.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0); 18 10/23/2019 Chương 3.6 Khóa file Lập trình an toàn ReadFile(fileHandle,buff,128,&bytesRead,0); buff[bytesRead] = 0; printf("File content:%s\n",buff); LockFile(fileHandle,0,0,100,0); // Exclusive Lock printf("File is locked, press any key to unlock \n"); getch(); UnlockFile(fileHandle,0,0,100,0); printf("File is unlocked\n"); getch(); CloseHandle(fileHandle); 3.7 Tạo file tạm Chương Lập trình an tồn Sau tiến trình kết thúc cách bình thường/khơng bình thường, file tạm truy nhập Ví dụ char szPath[] = “fileXXXXXX"; int fd; fd = mkstemp(szPath); unlink(szPath); printf("Temperary file created, press any key to continue "); write(fd,"Hello",5); close(fd); 3.7 Tạo file tạm Chương Lập trình an toàn Ứng dụng tạo file tạm để lưu trữ thơng tin tạm thời chương trình File tạm nên tạo lập cách an toàn, xóa kết thúc chương trình Trên unix/linux: Hàm mkstemp() sử dụng để tạo file tạm với tên ngẫu nhiên Ứng dụng cần xóa file theo tên, sau lời gọi mkstemp để đảm bảo khơng tiến trình truy nhập 3.7 Tạo file tạm Chương Lập trình an tồn Trên Windows: Khơng có hàm tương đương mkstemp() GetTempFileName() sinh tên file ngẫu nhiên dễ đoán GetTempPath() lấy đường dẫn đến thư mục tạm người dùng Tạo file hàm CreateFile với hai thuộc tính FILE_ATTRIBUTE_TEMPORARY FILE_FLAG_DELETE_ON_CLOSE 19 10/23/2019 3.7 Tạo file tạm Chương Lập trình an tồn Ví dụ HANDLE fileHandle = NULL; fileHandle = CreateFile(L"C:\\SecureProgramming\\Tmp.txt", GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE, 0, OPEN_ALWAYS,FILE_ATTRIBUTE_TEMPORARY| FILE_FLAG_DELETE_ON_CLOSE,0); 3.8 Hạn chế truy nhập đến hệ Chương thống file 3.8 Hạn chế truy nhập đến hệ Chương thống file Lập trình an tồn Trên Unix/Linux, ứng dụng tự giới hạn phạm vi truy nhập hệ thống tập tin lệnh chroot() Sau gọi chroot(): Tiến trình khơng thể mở rộng phạm vi truy nhập lệnh chroot lần Tiến trình thu hẹp phạm vi truy nhập Tiến trình phải chủ động gọi thêm chdir() để lệnh chroot có hiệu lực Lập trình an toàn VD: #include chroot("/new/root/directory"); chdir("/"); 20