跳转至

Format String Vulnerability

格式化字符串漏洞

描述

当程序未能正确验证或清理用作格式化输出函数中格式说明符的用户输入时,就会出现格式化字符串漏洞(Format string vulnerability)。这可能允许攻击者操纵格式化字符串参数,并可能执行任意代码或泄露敏感信息。

格式化字符串漏洞的影响可能非常严重,会导致: 1. 信息泄露:利用格式化字符串漏洞,攻击者可以从内存中提取敏感信息。这可能包括密码、加密密钥或其他关键信息等机密数据。

  1. 远程代码执行 (RCE):格式化字符串漏洞可被利用以远程在系统上执行任意代码。这使得攻击者能够获得对系统的控制权,从而可能导致未经授权的访问或敏感数据的窃取。

  2. 拒绝服务 (DoS):攻击者可以操纵格式化字符串漏洞来使程序崩溃或诱导其进入无限循环。这种类型的攻击会导致拒绝服务 (DoS),使得合法用户无法访问该系统或应用程序。

示例

// gcc vulnerable.c

#include <stdio.h>
#include <unistd.h>

int main() {
    int secret_num = 0x8badf00d;

    char name[64] = {0};
    read(0, name, 64);
    printf("Hello ");
    printf(name);
    printf("! You'll never get my secret!\n");
    return 0;
}

建议

为了缓解与格式化字符串攻击相关的漏洞,至关重要的是遵循某些最佳实践:

  • 避免使用直接接受用户输入的格式化字符串函数,而应使用更安全的替代方法,例如字符串连接或不依赖于用户控制的格式化字符串的格式化打印函数。
  • 将输入验证和清理作为一项加固措施,以确保用户提供的数据符合预期的格式。

代码示例:

#include <stdio.h>

int main() {
    int secret_num = 0x8badf00d;

    char name[64] = {0};

    printf("Enter your name: ");
    if (fgets(name, sizeof(name), stdin) != NULL) {
        // Remove the newline character from the input
        size_t len = strlen(name);
        if (len > 0 && name[len - 1] == '\n') {93317
            name[len - 1] = '\0';
        }

        printf("Hello %s! You'll never get my secret!\n", name);
    } else {
        // Handle error reading input
        printf("Error reading input.\n");
        return 1;
    }

    return 0;
}

链接

标准

  • OWASP_MASVS_L1:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_L2:
    • MSTG_PLATFORM_2
  • OWASP_MASVS_v2_1:
    • MASVS_CODE_4
  • SOC2_CONTROLS:
    • CC_2_1
    • CC_3_4
    • CC_4_1
    • CC_7_1
    • CC_7_2
    • CC_7_4
    • CC_7_5