Format String là gì?
Chuỗi định dạng (format string) là chuỗi ASCII chứa văn bản và các chỉ định định dạng (ví dụ %d, %s) dùng trong printf, sprintf...
Lỗ hổng Format String
Xảy ra khi dữ liệu đầu vào của người dùng được truyền trực tiếp làm format string cho các hàm xuất (printf, fprintf...). Kẻ tấn công có thể dùng các chỉ định như %n, %x, %s để đọc/ghi bộ nhớ tùy ý.
Ví dụ lỗ hổng
#include
#include
int main() {
char buffer[100];
strncpy(buffer, "Hi ", 5);
printf(buffer); // nguy hiểm nếu buffer chứa %n, %x...
return 0;
}
Phòng tránh
- Luôn dùng format string tĩnh:
printf("%s", buffer);thay vìprintf(buffer);. - Sử dụng hằng số cho format string, tách biến làm tham số.
- Bật cảnh báo compiler:
-Wformat -Wformat-security(GCC/Clang). - Sử dụng các hàm an toàn hơn (snprintf, vsnprintf).