2009-03-10 35 views
5

Chúng tôi có một lỗi Coverity cho dòng mã này:snprintf Format Chuỗi lỗ hổng bảo mật vấn đề

snprintf(tempStr, size, testStrings[testID], A2DtoV(testResults[testID].value), 
A2DtoV(testResults[testID].min),A2DtoV(testResults[testID].max)); 

Lỗi nói:

non_const_printf_format_string: "format string is not a string literal, 
potential security vulnerability if user controlled" 

tôi đã thay đổi testStrings sang const, nhưng điều đó không làm bất cứ điều gì:

static const char *testStrings[] = {"1", ... etc}; 

Bất kỳ ý tưởng nào về những gì lỗi này thực sự đang nói?

Trả lời

10

Mã của bạn vẫn ổn.

Vấn đề là nếu bạn chuyển một chuỗi được người dùng kiểm soát dưới dạng chuỗi định dạng printf, các lỗi bảo mật có thể phát sinh.

Ví dụ, printf(userName);

đâu userName được cung cấp bởi người sử dụng, người dùng có thể vượt qua "% s", và nhận được chức năng của bạn để bắt đầu truy cập vào dữ liệu tại một địa chỉ ngẫu nhiên trên stack, mà có thể dẫn đến một tai nạn. printf sẽ cố gắng bật các tham số bổ sung ngoài ngăn xếp, dẫn đến một tham nhũng ngăn xếp. Tấn công từ chối dịch vụ như thế này có lẽ là trường hợp tốt nhất, thông tin có thể được tiết lộ bằng cách lấy printf để loại bỏ các giá trị trên ngăn xếp và thậm chí còn có cách để có được các chức năng kiểu printf để sửa đổi địa chỉ trả về trên ngăn xếp.

Vì chuỗi của bạn không được người dùng kiểm soát, bạn có thể bỏ qua thông báo này một cách an toàn. Sửa chữa điển hình là thay thế ví dụ printf mà tôi đã cung cấp với printf("%s", userName);, có vẻ như không giúp bạn trong trường hợp của bạn vì các chuỗi const dường như chứa các chuỗi định dạng.

Wikipedia có nhiều lỗ hổng về chuỗi định dạng tại đây: http://en.wikipedia.org/wiki/Format_string_vulnerabilities

2

Ý tưởng là giá trị của testStrings[testID] có thể được thay đổi bằng cách nào đó để bao gồm các bộ định dạng thêm định dạng.

snprintf() không có khả năng kiểm tra xem số tham số có khớp với số lượng định dạng hay không, nó sẽ chỉ lấy địa chỉ tiếp theo từ ngăn xếp để sử dụng làm giá trị cho định dạng tiếp theo và những điều kỳ lạ có thể xảy ra sau đó.

Được gọi là format string attack.

Các vấn đề liên quan