Bài giảng Lập trình an toàn (Secure Programming) - Lương Ánh Hoàng

LẬP TRÌNH AN TOÀN  
Secure Programming  
Lương Ánh Hoàng  
Mục đích  
Cung cấp các kiến thức, kỹ thuật cơ bản để xây dựng các ứng dụng an  
toàn.  
2
Yêu cầu  
Yêu cầu về kiến thức:  
An ninh mạng  
Ngôn ngữ lập trình C/C++.  
Lên lớp đầy đủ  
3
Thời lượng môn học  
Thời lượng: 45 tiết  
Lý thuyết: 30 tiết  
Bài tập:15 tiết  
4
Tài liệu  
Secure Program Cookbook for C and C++, Matt Messier,  
John Viega, O'Reilly 2003.  
5
Nội dung  
Chương 1. Kiểm tra đầu vào  
Chương 2. Kiểm soát truy nhập  
Chương 3. Kiểm soát xung đột  
Chương 4. Mã hóa đối xứng  
Chương 5. Hàm băm và xác thực thông điệp  
Chương 6. Mã hóa công khai  
Chương 7. Anti-Tampering  
Chương 8. Các vấn đề khác  
6
7
Đánh giá  
Bài tập lớn: 70%  
Quá trình: 30%  
8
Chương 1. Kiểm tra đầu vào  
Input Validation  
Lương Ánh Hoàng  
Nội dung  
1.1 Nguyên tắc kiểm tra.  
1.2 Các hàm định dạng xâu (string formatting) .  
1.3 Tràn bộ đệm.  
1.4 Tràn số học.  
1.5 Kiểm tra tên ꢀile và đường dẫn.  
1.6 Giải mã URL  
1.7 Cross-Site Scripting  
1.8 SQL Injection  
10  
1.1 Các nguyên tắc kiểm tra  
Luôn luôn giả định dữ liệu đầu vào là không đáng tin cậy  
Dữ liệu từ mạng trong mô hình client-server  
Dữ liệu từ người dùng  
Dữ liệu từ tệp tin  
…  
Ưu tiên loại bỏ dữ liệu hơn là cố gắng sửa chữa dữ liệu.  
Thực hiện kiểm tra đầu vào tại nhiều cấp, nhiều điểm  
Kiểm tra đầu vào ở các hàm  
Kiểm tra đầu vào giữa các module.  
…  
Không tiếp nhận lệnh trực tiếp từ người dùng nếu chưa qua kiểm tra.  
Kiểm tra các ký tự đặc biệt, dấu nháy.  
Tìm hiểu và sử dụng cơ chế trích dẫn (quoting mechanism) nếu cần.  
Càng hiểu về dữ liệu bao nhiêu càng lọc được tốt bấy nhiêu.  
11  
1.2 Các hàm định dạng xâu  
Họ các hàm printf() , syslog() cho phép định dạng dữ liệu rất mềm dẻo và  
mạnh mẽ tuy nhiên cũng cực kỳ nguy hiểm.  
Thận trọng khi sử dụng “%n”  
Tham số %n cho phép ghi ra số lượng ký tự đã kết xuất được ra một địa chỉ bất kỳ chỉ ra  
trong tham số tương ứng. Nếu không tồn tại tham số nào thì printf sẽ ghi đè lên một vùng  
nào đó thuộc stack của luồng đang thực thi.  
VD.  
int  
counter = 0;  
printf(“Hello%n”,&counter); // OK, counter = 5  
printf(“Hello%n”); // Nguy hiểm !!!  
Không sử dụng trực tiếp xâu định dạng từ nguồn bên ngoài  
Xâu định dạng có nguồn gốc từ ngoài chương trình có thể có một vài ký tự đặc biệt mà  
chương trình chưa lường trước được, hoặc không có tham số thay thế tương ứng.  
VD.  
char  
str[1024];  
gets(str);  
printf(“Xin chao:”);  
printf(str); // Nguy hiểm !!!  
printf(“%s”,str); // OK  
12  
1.2 Các hàm định dạng xâu  
Thận trọng khi sử dụng sprintf, vsprintf với “%s”  
Các hàm trên đều giả định kích thước bộ đệm cho xâu đích là vô hạn.  
Nên chỉ rõ số lượng ký tự tối đa sẽ sử dụng khi dùng với %s.  
Nên sử dụng snprintf, vsnprintf nếu có thể.  
VD  
char str[1024];  
char dst[32];  
gets(str);  
sprintf(dst,”Xau vua nhap vao la %s”,str); // Nguy hiểm  
sprintf(dst,”Xau vua nhap vao la %.16s”,str); // OK  
snprintf(dst,32,”Xau vua nhap vao la %s”,str);// OK  
13  
1.3 Tràn bộ đệm  
Tràn bộ đệm (Buffer Overꢀlow): copy dữ liệu vượt quá biên của một bộ  
đệm nào đó => đè lên vùng nhớ của biến (cấu trúc) khác.  
Phần lớn các hàm xử lý xâu trong C đều không thực hiện kiểm tra biên  
của bộ đệm: gets, strcpy, …  
VD1: Dữ liệu bị hỏng  
int  
x = 0;  
char  
buff[8];  
strcpy(buff,”Hello AAAAAAAAAAAAAAAAAAAAAAAAAAAAA”);  
printf(“%d”,x);  
VD2: Stack bị hỏng  
char  
name[8];  
gets(name);  
printf(name);  
14  
1.3 Tràn bộ đệm  
VD3: Không trở về được từ chương trình con  
void Hello()  
{
char name[8];  
printf(“What is your name ?”);  
gets(name);  
printf(“Hello %s !”, name);  
}
void main()  
{
Hello();  
printf(“Bye”);  
}
15  
1.3 Tràn bộ đệm  
VD4: Tấn công có chủ ý trên bộ đệm  
void Bye()  
{
printf(“Bye”);  
}
void Hello()  
{
void (*p)() = Bye;  
char name[8];  
printf(“What is your name ?”);  
gets(name);  
printf(“Hello %s !”, name);  
p();  
}
void main()  
{
Hello();  
}
16  
1.3 Tràn bộ đệm  
Giải pháp:  
Sử dụng các hàm strncpy, memcpy…và những hàm có kiểm soát kích thước  
bộ đệm một cách tường minh.  
Sử dụng Stack Guard trong các trình biên dịch hỗ trợ.  
Sử dụng DEP (Data Execution Preventation) trên hệ điều hành hỗ trợ.  
Sử dụng ASLR (Address Space Layout Randomization) trên trình biên  
dịch và hệ điều hành hỗ trợ.  
17  
1.4 Tràn số học  
Dữ liệu nhận về có thể có sai sót trong trường liên quan đến kích  
thước.  
Các thao tác liên quan đến số nguyên lớn có thể bị tràn, lẫn lộn giữa số  
nguyên không dấu và có dấu  
VD1: Tràn số  
unsigned int x = 0xFFFFFFFF; // MAX_INT  
if  
( x+5 > 5 ) printf (“X > 0” )  
else printf(“X < 0”);  
VD2: Dùng sai kiểu có/không dấu  
if (x < MAX_SIZE) { // x, số byte cần cấp phát tùy theo giải thuật tính được  
if (!(ptr = (unsigned char *)malloc(x))) abort( );  
}
else  
{
/* Handle the error condition ... */  
}
18  
1.5 Kiểm tra tên ꢀile và đường dẫn  
Dữ liệu nhận về có thể là tên ꢀile, ứng dụng cần xác định đường dẫn  
tuyệt đối nếu cần thiết.  
Dùng hàm realpath() trên Unix/Linux và GetFullPathName trên  
Windows.  
Sử dụng realpath()  
§Nguyên mẫu:  
char *realpath(const char *pathname, char resolved_path[MAXPATHLEN]);  
§Thận trọng: Có thể tràn resolved_path và không thread-safe.  
§Thư viện: stdlih.h  
§VD  
char resolved[1024];  
char * result = realpath("printf.c",resolved);  
printf("%s",result);  
19  
1.5 Kiểm tra tên ꢀile và đường dẫn  
Sử dụng GetFullPathName()  
§Thư viện: windows.h  
§Nguyên mẫu:  
DWORD GetFullPathName(LPCTSTR lpFileName, DWORD nBufferLength, LPTSTR  
lpBuffer, LPTSTR *lpFilePath);  
§VD:  
int  
nBufferLen = 0;  
LPTSTR lpBuffer;  
nBufferLen = GetFullPathName(L"test.c",0,0,0);  
if (nBufferLen>0)  
{
lpBuffer = new TCHAR[nBufferLen+1];  
GetFullPathName(L"test.c",nBufferLen,lpBuffer,0);  
wprintf(L"%s",lpBuffer);  
}
20  
Tải về để xem bản đầy đủ
pdf 131 trang baolam 28/04/2022 10660
Bạn đang xem 20 trang mẫu của tài liệu "Bài giảng Lập trình an toàn (Secure Programming) - Lương Ánh Hoàng", để tải tài liệu gốc về máy hãy click vào nút Download ở trên

File đính kèm:

  • pdfbai_giang_laptrinh_antoan_secure_programming_luong_anh_hoang.pdf