suricata之日志截斷

一、背景

在suricata的調試過程中,使用SCLogXXX api進行信息的輸出,發現輸出的日志被截斷了,最開始以為是解析邏輯有問題,沒有解析完整,經過排查后,發現SCLogXXX api內部進行了長度限制,最長2K。

OS:Ubuntu 22.04.5 LTS
IDE: vscode
Suricata: suricata 7.0.5

二、 問題復現

拷貝一個規則,將規則內容填充任意內容,使其達到2K以上
請添加圖片描述

規則重復時,輸出錯誤日志,日志截斷
請添加圖片描述

三、分析

3.1 源碼實現

// src/util-debug.h
/* The maximum length of the log message */
#define SC_LOG_MAX_LOG_MSG_LEN 2048// src/util-debug.c
void SCLogErr(int x, const char *file, const char *func, const int line, const char *module,const char *fmt, ...)
{if (sc_log_global_log_level >= x &&(sc_log_fg_filters_present == 0 ||SCLogMatchFGFilterWL(file, func, line) == 1 ||SCLogMatchFGFilterBL(file, func, line) == 1) &&(sc_log_fd_filters_present == 0 ||SCLogMatchFDFilter(func) == 1)){char msg[SC_LOG_MAX_LOG_MSG_LEN];va_list ap;va_start(ap, fmt);vsnprintf(msg, sizeof(msg), fmt, ap);va_end(ap);SCLogMessage(x, file, line, func, module, msg);}
}

從實現中可以看出,首先將數據格式化到一個局部臨時變量中,再將臨時變量輸出。
而臨時變量是一個2K的字符數組,因此需要輸出的數據超過2K將被截斷。

3.2 為啥需要臨時變量

  1. 將可變參數格式化成一個字符串,需要一個存儲空間
  2. 棧變量是線程安全的
  3. 簡單通用

3.3 是否可以增加空間

可以增加SC_LOG_MAX_LOG_MSG_LEN的值,但是不推薦

  1. 每條日志大小一般都很小,2K已經滿足90%以上的情況
  2. 棧變量太大,遞歸或深層調用可能會耗盡棧空間
// 棧默認大小(KB)
$ ulimit -s
8192 // 棧最大上限,受系統內存限制
$ ulimit -Hs
unlimited// glibc 中的默認值
$ getconf PTHREAD_STACK_MIN
16384

3.4 非要解決截斷問題如何處理

man vsnprintf

The  functions snprintf() and vsnprintf() do not write more than size bytes (including theterminating null byte ('\0')).  If the output was truncated due to this  limit,  then  thereturn value is the number of characters (excluding the terminating null byte) which wouldhave been written to the final string if enough space had been available.  Thus, a  returnvalue of size or more means that the output was truncated.  

根據man手冊的說明,可以判斷vsnprintf的返回值,返回值超過2048時,可以動態申請空間,再次進行格式化

    char msg[SC_LOG_MAX_LOG_MSG_LEN];char *real_msg = msg;va_list ap;va_start(ap, fmt);int ret = vsnprintf(msg, sizeof(msg), fmt, ap);va_end(ap);if (ret > SC_LOG_MAX_LOG_MSG_LEN) { // 被截斷real_msg = SCMalloc(ret+1); // 動態分配空間if (likely(real_msg != NULL)) {va_start(ap, fmt);vsnprintf(real_msg, ret+1, fmt, ap); // 重新格式化va_end(ap);} else {real_msg = msg; // 空間申請失敗}}SCLogMessage(x, file, line, func, module, real_msg);if (real_msg != msg) {SCFree(real_msg);}

結果是依然被截斷了,繼續分析SCLogMessage實現

SCError SCLogMessage(const SCLogLevel log_level, const char *file, const unsigned int line,const char *function, const char *module, const char *message)
{char buffer[SC_LOG_MAX_LOG_MSG_LEN] = "";...case SC_LOG_OP_IFACE_CONSOLE:if (SCLogMessageGetBuffer(ts, op_iface_ctx->use_color, op_iface_ctx->type, buffer,sizeof(buffer),op_iface_ctx->log_format ? op_iface_ctx->log_format: sc_log_config->log_format,log_level, file, line, function, module, message) == 0) {SCLogPrintToStream((log_level == SC_LOG_ERROR)? stderr: stdout, buffer);}break;...return SC_OK;
}

又一個buffer[SC_LOG_MAX_LOG_MSG_LEN], 再次被截斷

3.5 為啥是兩次格式化

請添加圖片描述

第一次是將用戶輸入的信息格式化;
第二次增加額外信息(時間、函數名,行號等),可通過配置決定添加的信息
suricata.yaml

logging:default-log-format: "%D: %S:%l %M"

總結

日志截斷問題的主要原因是日志內容經過兩次格式化,且每次格式化都使用了固定大小的緩沖區。通過動態分配緩沖區,可以有效避免日志被截斷的問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/904938.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/904938.shtml
英文地址,請注明出處:http://en.pswp.cn/news/904938.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

navicat 如何導出數據庫表 的這些信息 字段名 類型 描述

navicat 如何導出數據庫表 的這些信息 字段名 類型 描述 數據庫名字 springbootmt74k 表名字 address SELECT COLUMN_NAME AS 字段名,COLUMN_TYPE AS 類型,COLUMN_COMMENT AS 描述 FROM information_schema.COLUMNS WHERE TABLE_SCHEMA springbootmt74k AND TABLE_NAME a…

LVGL圖像導入和解碼

LVGL版本:8.1 概述 在LVGL中,可以導入多種不同類型的圖像: 經轉換器生成的C語言數組,適用于頁面中不常改變的固定圖像。存儲系統中的外部圖像,比較靈活,可以通過插卡或從網絡中獲取,但需要配置…

【Web前端開發】HTML基礎

Web前端開發是用來直接給用戶呈現一個一個的網頁,主要包含實現用戶的結構(HTML)、樣式(CSS)、交互(JavaScript)。然而一個軟件通常是由后端和前端完成的。可以查閱文檔:HTML 教程 (w…

MySQL 8.0 單節點部署與一主兩從架構搭建實戰

前言:在數據驅動的時代,數據庫作為數據存儲與管理的核心組件,其架構的選擇與配置對系統的性能、可用性和擴展性至關重要。MySQL 作為一款廣泛應用的開源關系型數據庫,憑借其穩定的性能和豐富的功能,深受開發者和企業的…

數據庫故障排查全攻略:從實戰案例到體系化解決方案

一、引言:數據庫故障為何是技術人必須攻克的 "心腹大患" 在數字化時代,數據庫作為企業核心數據資產的載體,其穩定性直接決定業務連續性。據 Gartner 統計,企業每小時數據庫 downtime 平均損失高達 56 萬美元&#xff0…

牛客周賽round91

C 若序列為1 4 5 7 9 1 2 3,1 9一定大于1 1或1 4...所以只需要記錄當前數之前數字的最大值,然后遍歷取max即可,所以對于上面的序列有效的比較為1 9,2 9,3 9取max 代碼 //求大于當前數的最大值,然后…

【MCAL】TC397+EB-tresos之I2c配置實戰(同步、異步)

I2C總線是Philips公司在八十年代初推出的一種串行、半雙工的總線,主要用于近距離、低速的芯片之間的通信。本篇文章首先從理論講起,介紹了英飛凌TC3x系列芯片對應MCAL中對I2C驅動的定義與介紹,建議讀者在閱讀本篇文章之前對I2C有個簡單的認識…

深拷貝與淺拷貝:理解 Python 中的對象復制機制

深拷貝與淺拷貝:理解 Python 中的對象復制機制 在 Python 編程中,對象的復制是一個常見的操作。然而,很多初學者在處理對象復制時會遇到困惑,尤其是在涉及到復雜數據結構(如列表、字典、自定義對象等)時。…

BeanPostProcessor和AOP

BeanPostProcessor Spring中有一個接口Oredr的getOrder()方法,這個方法返回值是一個int類型,Spring容器會根據這個方法的返回值 對容器的多個Processor對象從小到大排序,創建Bean時候依次執行他們的方法,也就是說getOrder()方法的…

拒絕服務攻擊(DoS/DDoS/DRDoS)詳解:洪水猛獸的防御之道

在數字時代,服務的可用性是衡量一個在線系統成功與否的關鍵指標之一。然而,存在一類被稱為"拒絕服務攻擊" (Denial of Service, DoS) 的網絡攻擊,其主要目的就是通過各種手段耗盡目標服務器或網絡的資源,使其無法響應正…

小剛說C語言刷題—1078求恰好使s=1+1/2+1/3+…+1/n的值大于X時n的值

1.題目描述 求恰好使 s11/21/3?1/n 的值大于 X 時 n 的值。( 2≤x≤10 ) 輸入 輸入只有一行,包括 1個整數 X 。 輸出 輸出只有一行(這意味著末尾有一個回車符號),包括 1 個整數。 樣例 輸入 2 輸出 4 2.參考代碼(C語言…

深度學習中的目標檢測:從 PR 曲線到 AP

深度學習中的目標檢測:從 PR 曲線到 AP 在目標檢測任務中,評估模型的性能是非常重要的。通過使用不同的評估指標和標準,我們可以量化模型的準確性與效果。今天我們將重點討論 PR 曲線(Precision-Recall Curve)、平均精…

MySQL 1366 - Incorrect string value:錯誤

MySQL 1366 - Incorrect string value:錯誤 錯誤如何發生發生原因: 解決方法第一種嘗試第二種嘗試 錯誤 如何發生 在給MySQL添加數據的時候發生了下面的錯誤 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…

[ctfshow web入門] web70

信息收集 使用cinclude("php://filter/convert.base64-encode/resourceindex.php");讀取的index.php error_reporting和ini_set被禁用了,不必管他 error_reporting(0); ini_set(display_errors, 0); // 你們在炫技嗎? if(isset($_POST[c])){…

Linux在web下http加密和配置虛擬主機及動態頁面發布

web服務器的數據加密 1.簡介:由于http協議以明文方式發送,不提供任何方式的數據加密,也不適合傳輸一些重要的信息,如銀行卡號、密碼等,解決該缺陷設計了安全套接字層超文本傳輸協議https; 2.https的握手流…

uni-app,小程序中的addPhoneContact,保存聯系人到手機通訊錄

文章目錄 方法詳解簡介 基本語法參數說明基礎用法使用示例平臺差異說明注意事項最佳實踐 方法詳解 簡介 addPhoneContact是uni-app框架提供的一個實用API,用于向系統通訊錄添加聯系人信息。這個方法在需要將應用內的聯系人信息快速保存到用戶設備通訊錄的場景下非…

NHANES稀有指標推薦:HALP score

文章題目:Associations of HALP score with serum prostate-specific antigen and mortality in middle-aged and elderly individuals without prostate cancer DOI:10.3389/fonc.2024.1419310 中文標題:HALP 評分與無前列腺癌的中老年人血清…

【django.db.utils.OperationalError: unable to open database file】

解決platform.sh 環境下,無法打開數據庫問題 場景 在platform.sh 執行python manage.py createsuperuser是提示 django.db.utils.OperationalError: unable to open database file 錯誤 原因 由于settings.py文件中 本地數據庫配置在線上配置后,導致…

【前端分享】CSS實現3種翻頁效果類型,附源碼!

使用 css 可以實現多種翻頁效果&#xff0c;比如書本翻頁、卡片翻轉等。以下是兩種常見的翻頁效果實現&#xff1a; 效果 1&#xff1a;書本翻頁效果 通過 transform 和 rotateY 實現 3D 翻頁效果。 html 結構 <divclass"book"> <divclass"page pa…

【部署滿血Deepseek-R1/V3】大型語言模型部署實戰:多機多卡DeepSeek-R1配置指南

大家好&#xff01;這里是迪小莫學AI&#xff0c;今天的文章是“”大型語言模型部署實戰&#xff1a;多機多卡DeepSeek-R1配置指南“” 前言 隨著大型語言模型的快速發展&#xff0c;如何高效部署這些模型成為技術團隊面臨的重要挑戰。本文將分享基于DeepSeek-R1模型的多機多…