ModSecurity icon indicating copy to clipboard operation
ModSecurity copied to clipboard

Segment error occurs after calling msc_set_log_cb set callback function

Open dkwang2024 opened this issue 1 year ago • 1 comments

/*
 * ModSecurity, http://www.modsecurity.org/
 * Copyright (c) 2015 - 2021 Trustwave Holdings, Inc. (http://www.trustwave.com/)
 *
 * You may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * If any of the files related to licensing are missing or if you have any
 * other questions related to licensing please contact Trustwave Holdings, Inc.
 * directly using the email address [email protected].
 *
 */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "modsecurity/modsecurity.h"
#include "modsecurity/rules_set.h"
#include <modsecurity/transaction.h>
#include <modsecurity/intervention.h>


void log_callback(void *data, const void *ruleMessage) {
    const ModSecurityIntervention *intervention = (const ModSecurityIntervention *)ruleMessage;
    if (intervention->log != NULL) {
        printf("Log: %s\n", intervention->log);
    }
}

char main_rule_uri[] = "basic_rules.conf";

int main (int argc, char **argv)
{
    int ret;
    const char *error = NULL;
    ModSecurity *modsec;
    Transaction *transaction = NULL;
    RulesSet *rules;
    
    modsec = msc_init();
    
    msc_set_connector_info(modsec, "ModSecurity-test v0.0.1-alpha (Simple " \
        "example on how to use ModSecurity API");

    rules = msc_create_rules_set();

    ret = msc_rules_add_file(rules, main_rule_uri, &error);
    if (ret < 0) {
        fprintf(stderr, "Problems loading the rules --\n");
        fprintf(stderr, "%s\n", error);
        goto end;
    }
    
    // **Segment error**
    msc_set_log_cb(modsec, log_callback);
    
    // msc_rules_dump(rules);
    
    // 打开日志文件
    FILE *log_file = fopen("webalert.txt", "a");
    if (log_file == NULL) {
        fprintf(stderr, "Failed to open log file\n");
        msc_rules_cleanup(rules);
        msc_cleanup(modsec);
        return 1;
    }

    transaction = msc_new_transaction(modsec, rules, NULL);
    
    msc_process_connection(transaction, "127.0.0.1", 12345, "127.0.0.1", 80);
    msc_process_uri(transaction,
        "http://www.modsecurity.org/index.php?id=select../../../etc/passwd",
        "GET", "1.1");
    //msc_process_request_headers(transaction);
    // 模拟请求参数
    msc_add_request_header(transaction, "Host", "example.com");
    msc_add_request_header(transaction, "User-Agent", "TestAgent");
    msc_add_request_header(transaction, "Accept", "*/*");
    msc_add_request_header(transaction, "Content-Type", "application/x-www-form-urlencoded");

    // 处理请求头
    msc_process_request_headers(transaction);
    msc_process_request_body(transaction);
    msc_process_logging(transaction);
    
    
end:
    if(error != NULL)
        msc_rules_error_cleanup(error);
    msc_rules_cleanup(rules);
    msc_cleanup(modsec);

    return 0;
}

dkwang2024 avatar Nov 01 '24 10:11 dkwang2024

How do you want to compile this test? And with which compiler?

I built it with gcc and it runs as well without problem.

Btw I don't see the reason why do you cast the line 28.

    27  void log_callback(void *data, const void *ruleMessage) {
    28      const ModSecurityIntervention *intervention = (const ModSecurityIntervention *)ruleMessage;
    29      if (intervention->log != NULL) {
    30          printf("Log: %s\n", intervention->log);
    31      }
    32  }

ModSecurityIntervention is a completely different type as the function expects there. You can consider ruleMessage there is a C string. Perhaps the segment error caused by this, but as I wrote I wasn't able to reproduce this.

airween avatar Nov 05 '24 11:11 airween