99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

保證BPF程序安全的BPF驗(yàn)證器介紹

Linux閱碼場 ? 來源:Linux內(nèi)核之旅 ? 作者:梁金榮 ? 2021-05-03 11:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

1. 前言

我們可以使用BPF對Linux內(nèi)核進(jìn)行跟蹤,收集我們想要的內(nèi)核數(shù)據(jù),從而對Linux中的程序進(jìn)行分析和調(diào)試。與其它的跟蹤技術(shù)相比,使用BPF的主要優(yōu)點(diǎn)是幾乎可以訪問Linux內(nèi)核和應(yīng)用程序的任何信息,同時(shí),BPF對系統(tǒng)性能影響很小,執(zhí)行效率很高,而且開發(fā)人員不需要因?yàn)槭占瘮?shù)據(jù)而修改程序。

本文將介紹保證BPF程序安全的BPF驗(yàn)證器,然后以BPF程序的工具集BCC為例,分享kprobes和tracepoints類型的BPF程序的使用及程序編寫示例。

2. BPF驗(yàn)證器

BPF借助跟蹤探針收集信息并進(jìn)行調(diào)試和分析,與其它依賴于重新編譯內(nèi)核的工具相比,BPF程序的安全性更高。重新編譯內(nèi)核引入外部模塊的方式,可能會因?yàn)槌绦虻腻e誤而產(chǎn)生系統(tǒng)奔潰。BPF程序的驗(yàn)證器會在BPF程序加載到內(nèi)核之前分析程序,消除這種風(fēng)險(xiǎn)。

BPF驗(yàn)證器執(zhí)行的第一項(xiàng)檢查是對BPF虛擬機(jī)加載的代碼進(jìn)行靜態(tài)分析,目的是確保程序能夠按照預(yù)期結(jié)束。驗(yàn)證器在進(jìn)行第一項(xiàng)檢查時(shí)所做工作為:

程序不包含控制循環(huán);

程序不會執(zhí)行超過內(nèi)核允許的最大指令數(shù);

程序不包含任何無法到達(dá)的指令;

程序不會超出程序界限。

BPF驗(yàn)證器執(zhí)行的第二項(xiàng)檢查是對BPF程序進(jìn)行預(yù)運(yùn)行,所做工作為:

分析BPF程序執(zhí)行的每條指令,確保不會執(zhí)行無效指令;

檢查所有內(nèi)存指針是否可以正確訪問和引用;

預(yù)運(yùn)行將程序控制流的執(zhí)行結(jié)果通知驗(yàn)證器,確保BPF程序最終都會執(zhí)行BPF_EXIT指令。

3. 內(nèi)核探針 kprobes

內(nèi)核探針可以跟蹤大多數(shù)內(nèi)核函數(shù),并且系統(tǒng)損耗最小。當(dāng)跟蹤的內(nèi)核函數(shù)被調(diào)用時(shí),附加到探針的BPF代碼將被執(zhí)行,之后內(nèi)核將恢復(fù)正常模式。

3.1 kprobes類BPF程序的優(yōu)缺點(diǎn)

優(yōu)點(diǎn) 動態(tài)跟蹤內(nèi)核,可跟蹤的內(nèi)核函數(shù)眾多,能夠提取內(nèi)核絕大部分信息。

缺點(diǎn) 沒有穩(wěn)定的應(yīng)用程序二進(jìn)制接口,可能隨著內(nèi)核版本的演進(jìn)而更改。

3.2 kprobes

kprobe程序允許在執(zhí)行內(nèi)核函數(shù)之前插入BPF程序。當(dāng)內(nèi)核執(zhí)行到kprobe掛載的內(nèi)核函數(shù)時(shí),先運(yùn)行BPF程序,BPF程序運(yùn)行結(jié)束后,返回繼續(xù)開始執(zhí)行內(nèi)核函數(shù)。下面是一個使用kprobe的bcc程序示例,功能是監(jiān)控內(nèi)核函數(shù)kfree_skb函數(shù),當(dāng)此函數(shù)觸發(fā)時(shí),記錄觸發(fā)它的進(jìn)程pid,進(jìn)程名字和觸發(fā)次數(shù),并打印出觸發(fā)此函數(shù)的進(jìn)程pid,進(jìn)程名字和觸發(fā)次數(shù):

#!/usr/bin/python3

# coding=utf-8

from __future__ import print_function

from bcc import BPF

from time import sleep

# define BPF program

bpf_program = “”“

#include 《uapi/linux/ptrace.h》

struct key_t{

u64 pid;

};

BPF_HASH(counts, struct key_t);

int trace_kfree_skb(struct pt_regs *ctx) {

u64 zero = 0, *val, pid;

pid = bpf_get_current_pid_tgid() 》》 32;

struct key_t key = {};

key.pid = pid;

val = counts.lookup_or_try_init(&key, &zero);

if (val) {

(*val)++;

}

return 0;

}

”“”

def pid_to_comm(pid):

try:

comm = open(“/proc/%s/comm” % pid, “r”).read().rstrip()

return comm

except IOError:

return str(pid)

# load BPF

b = BPF(text=bpf_program)

b.attach_kprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

# header

print(“Tracing kfree_skb.。. Ctrl-C to end.”)

print(“%-10s %-12s %-10s” % (“PID”, “COMM”, “DROP_COUNTS”))

while 1:

sleep(1)

for k, v in sorted(b[“counts”].items(),key = lambda counts: counts[1].value):

print(“%-10d %-12s %-10d” % (k.pid, pid_to_comm(k.pid), v.value))

該bcc程序主要包括兩個部分,一部分是python語言,一部分是c語言。python部分主要做的工作是BPF程序的加載和操作BPF程序的map,并進(jìn)行數(shù)據(jù)處理。c部分會被llvm編譯器編譯為BPF字節(jié)碼,經(jīng)過BPF驗(yàn)證器驗(yàn)證安全后,加載到內(nèi)核中執(zhí)行。python和c中出現(xiàn)的陌生函數(shù)可以查下面這兩個手冊,在此不再贅述:

python部分遇到的陌生函數(shù)可以查這個手冊: 點(diǎn)此跳轉(zhuǎn)

c部分中遇到的陌生函數(shù)可以查這個手冊: 點(diǎn)此跳轉(zhuǎn)

需要說明的是,該BPF程序類型是kprobe,它是在這里進(jìn)行程序類型定義的:

b.attach_kprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

b.attach_kprobe()指定了該BPF程序類型為kprobe;

event=“kfree_skb”指定了kprobe掛載的內(nèi)核函數(shù)為kfree_skb;

fn_name=“trace_kfree_skb”指定了當(dāng)檢測到內(nèi)核函數(shù)kfree_skb時(shí),執(zhí)行程序中的trace_kfree_skb函數(shù);

BPF程序的第一個參數(shù)總為ctx,該參數(shù)稱為上下文,提供了訪問內(nèi)核正在處理的信息,依賴于正在運(yùn)行的BPF程序的類型。CPU將內(nèi)核正在執(zhí)行任務(wù)的不同信息保存在寄存器中,借助內(nèi)核提供的宏可以訪問這些寄存器,如PT_REGS_RC。

程序運(yùn)行結(jié)果如下:

e2411330-a100-11eb-8b86-12bb97331649.png

3.3 kretprobes

相比于內(nèi)核探針kprobe程序,kretprobe程序是在內(nèi)核函數(shù)有返回值時(shí)插入BPF程序。當(dāng)內(nèi)核執(zhí)行到kretprobe掛載的內(nèi)核函數(shù)時(shí),先執(zhí)行內(nèi)核函數(shù),當(dāng)內(nèi)核函數(shù)返回時(shí)執(zhí)行BPF程序,運(yùn)行結(jié)束后返回。

以上面的BPF程序?yàn)槔粢褂胟retprobe,可以這樣修改:

b.attach_kretprobe(event=“kfree_skb”, fn_name=“trace_kfree_skb”)

b.attach_kretprobe()指定了該BPF程序類型為kretprobe,kretprobe類型的BPF程序?qū)⒃诟櫟膬?nèi)核函數(shù)有返回值時(shí)執(zhí)行BPF程序;

event=“kfree_skb”指定了kretprobe掛載的內(nèi)核函數(shù)為kfree_skb;

fn_name=“trace_kfree_skb”指定了當(dāng)內(nèi)核函數(shù)kfree_skb有返回值時(shí),執(zhí)行程序中的trace_kfree_skb函數(shù);

4. 內(nèi)核靜態(tài)跟蹤點(diǎn) tracepoint

tracepoint是內(nèi)核靜態(tài)跟蹤點(diǎn),它與kprobe類程序的主要區(qū)別在于tracepoint由內(nèi)核開發(fā)人員在內(nèi)核中編寫和修改。

4.1 tracepoint 程序的優(yōu)缺點(diǎn)

優(yōu)點(diǎn) 跟蹤點(diǎn)是靜態(tài)的,ABI更穩(wěn)定,不隨內(nèi)核版本的變化而致不可用。

缺點(diǎn) 跟蹤點(diǎn)是內(nèi)核人員添加的,不會全面涵蓋內(nèi)核的所有子系統(tǒng)。

4.2 tracepoint 可用跟蹤點(diǎn)

系統(tǒng)中所有的跟蹤點(diǎn)都定義在/sys/kernel/debug/traceing/events目錄中:

e24d14fa-a100-11eb-8b86-12bb97331649.png

使用命令perf list 也可以列出可使用的tracepoint點(diǎn):

e2629bc2-a100-11eb-8b86-12bb97331649.png

對于bcc程序來說,以監(jiān)控kfree_skb為例,tracepoint程序可以這樣寫:

b.attach_tracepoint(tp=“skb:kfree_skb”, fn_name=“trace_kfree_skb”)

bcc遵循tracepoint命名約定,首先是指定要跟蹤的子系統(tǒng),這里是“skb:”,然后是子系統(tǒng)中的跟蹤點(diǎn)“kfree_skb”:

e29048b0-a100-11eb-8b86-12bb97331649.png

5. 總結(jié)

本文主要介紹了保證BPF程序安全的BPF驗(yàn)證器,然后以BPF程序的工具集BCC為例,分享了kprobes和tracepoints類型的BPF程序的使用及程序編寫示例。本文分享的是內(nèi)核跟蹤,那么用戶空間程序該如何跟蹤呢,這將在后面的文章中逐步分享,感謝閱讀。

原文標(biāo)題:梁金榮:使用eBPF追蹤LINUX內(nèi)核

文章出處:【微信公眾號:Linuxer】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

責(zé)任編輯:haq

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 內(nèi)核
    +關(guān)注

    關(guān)注

    3

    文章

    1416

    瀏覽量

    41443
  • Linux
    +關(guān)注

    關(guān)注

    87

    文章

    11511

    瀏覽量

    213837
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點(diǎn)推薦

    新思科技如何驗(yàn)證安全的智能汽車軟件

    汽車軟件正在迅速發(fā)展,其復(fù)雜性、安全性要求以及對高效開發(fā)流程的需求與日俱增。在這一背景下,虛擬ECU(vECU)成為加速開發(fā)和驗(yàn)證的關(guān)鍵工具,而將Rust語言集成進(jìn)AUTOSAR Classic環(huán)境則為行業(yè)帶來了寶貴的新可能。
    的頭像 發(fā)表于 07-10 15:12 ?246次閱讀
    新思科技如何<b class='flag-5'>驗(yàn)證</b>更<b class='flag-5'>安全</b>的智能汽車軟件

    編譯功能安全驗(yàn)證的關(guān)鍵要素

    在汽車、工業(yè)、醫(yī)療等安全關(guān)鍵型應(yīng)用中,確保功能安全合規(guī)性需要嚴(yán)格的工具鏈驗(yàn)證。開發(fā)安全關(guān)鍵型軟件的企業(yè)必須遵守ISO 26262、IEC 61508、ISO 62304等國際標(biāo)準(zhǔn)對編譯
    的頭像 發(fā)表于 07-05 13:37 ?492次閱讀

    Analog Devices Inc. ADMV8526-EVALZ評估板數(shù)據(jù)手冊

    Analog Devices Inc. ADMV8526-EVALZ評估板用于評估ADMV8526數(shù)字可調(diào)諧帶通濾波 (BPF)。ADMV8526具有1.25GHz至2.60GHz可調(diào)F~CENTER~頻率范圍,采用8位值(256狀態(tài)),集成正在申請專利的插值技術(shù)。
    的頭像 發(fā)表于 06-20 14:37 ?237次閱讀
    Analog Devices Inc. ADMV8526-EVALZ評估板數(shù)據(jù)手冊

    多線程的安全注意事項(xiàng)

    多線程安全是指多個線程同時(shí)訪問或修改共享資源時(shí),能夠保證程序的正確性和可靠性。 開發(fā)者選擇TaskPool或Worker進(jìn)行多線程開發(fā)時(shí),在TaskPool和Worker的工作線程中導(dǎo)入的API
    發(fā)表于 06-20 07:49

    超窄帶低波數(shù)拉曼濾光片的新升級(from 360-3000nm)

    超窄帶低波數(shù)拉曼濾光片的新升級from360nmto3000nm超窄帶陷波濾光片(BraggNotchFilter,簡稱BNF)和帶通濾光片(BraggBandpassFilter,簡稱BPF
    的頭像 發(fā)表于 05-28 11:13 ?1060次閱讀
    超窄帶低波數(shù)拉曼濾光片的新升級(from 360-3000nm)

    RS485之空調(diào)如何保證其更安全高效的防護(hù)機(jī)制

    RS485之空調(diào)如何保證其更安全高效的防護(hù)機(jī)制
    的頭像 發(fā)表于 05-05 16:00 ?348次閱讀
    RS485之空調(diào)如何<b class='flag-5'>保證</b>其更<b class='flag-5'>安全</b>高效的防護(hù)機(jī)制

    如何驗(yàn)證CAN控制的錯誤響應(yīng)機(jī)制?

    CAN節(jié)點(diǎn)的穩(wěn)定性、可靠性和安全性得益于其強(qiáng)大的錯誤管理機(jī)制。上一篇文章我們介紹了CAN控制的錯誤管理機(jī)制的工作原理。本文將基于其工作原理及ISO16845-1:2016標(biāo)準(zhǔn),為大家介紹
    的頭像 發(fā)表于 04-30 18:24 ?224次閱讀
    如何<b class='flag-5'>驗(yàn)證</b>CAN控制<b class='flag-5'>器</b>的錯誤響應(yīng)機(jī)制?

    超窄帶低波數(shù)拉曼濾光片的新升級(from 350nm to 3000nm)

    超窄帶陷波濾光片(Bragg Notch Filter,簡稱BNF)和帶通濾光片(Bragg Bandpass Filter,簡稱BPF)是目前實(shí)現(xiàn)超低波數(shù)拉曼光譜(通常50cm-1以下才稱為超低波數(shù)拉曼)測量常用的方法。設(shè)計(jì)波長覆蓋350-3000nm波段,超低波數(shù)拉曼信號可低至10cm-1.
    的頭像 發(fā)表于 04-09 16:54 ?318次閱讀
    超窄帶低波數(shù)拉曼濾光片的新升級(from 350nm to 3000nm)

    帶通濾波的定義和作用

    帶通濾波(Band-Pass Filter, BPF)作為信號處理領(lǐng)域的關(guān)鍵組件,扮演著舉足輕重的角色。它不僅在電子學(xué)和通信工程中占據(jù)核心地位,還在音頻處理、圖像處理、生物醫(yī)學(xué)工程等多個領(lǐng)域展現(xiàn)出
    的頭像 發(fā)表于 02-05 16:44 ?1837次閱讀

    帶通濾波的種類與技術(shù)架構(gòu)

    帶通濾波(Band-Pass Filter,BPF)是一種重要的信號處理元件,它允許特定頻率范圍內(nèi)的信號通過,同時(shí)衰減或抑制其他頻率的信號。這種濾波在電子技術(shù)和信號處理領(lǐng)域中具有廣泛的應(yīng)用,如無線通信、音頻處理、圖像處理等。
    的頭像 發(fā)表于 02-05 16:41 ?923次閱讀

    如何進(jìn)行電子連接的測試與驗(yàn)證

    連接在各種應(yīng)用場景下都能穩(wěn)定、安全地工作。 二、測試與驗(yàn)證的方法 1. 電氣性能測試 接觸電阻測試 :測量連接端子之間的電阻值,確保接觸性能良好,減少信號損失。使用接觸電阻測試儀進(jìn)
    的頭像 發(fā)表于 12-20 09:49 ?1551次閱讀

    智能安全配電裝置在臨時(shí)展會場所中如何保證用電安全

    與敷設(shè)、設(shè)備的維護(hù)和管理等方面介紹了其安全保障技術(shù),以保證此臨時(shí)類場所中用電的安全。 【關(guān)鍵詞】 臨時(shí)展會、展攤;電氣安全;智能
    的頭像 發(fā)表于 12-12 09:17 ?474次閱讀
    智能<b class='flag-5'>安全</b>配電裝置在臨時(shí)展會場所中如何<b class='flag-5'>保證</b>用電<b class='flag-5'>安全</b>

    電子設(shè)備濾波的種類 影響水質(zhì)的濾波類型

    于去除高頻噪聲,如音頻系統(tǒng)中的嘶嘶聲。 高通濾波(High Pass Filter,HPF) : 特性:允許高頻信號通過,同時(shí)衰減低頻信號。 應(yīng)用:常用于去除低頻噪聲,如交流電源中的嗡嗡聲,以及去除直流成分。 帶通濾波(Band Pass Filter,
    的頭像 發(fā)表于 11-27 15:52 ?800次閱讀

    Parker派克防爆電機(jī)在實(shí)際應(yīng)用中的安全性能如何保證

    Parker防爆電機(jī)通過防爆外殼、國際安全標(biāo)準(zhǔn)、專用防爆認(rèn)證、低火花設(shè)計(jì)、定制化繞組、應(yīng)用案例驗(yàn)證及溫度管理,確保實(shí)際應(yīng)用中的安全性能,防止爆炸風(fēng)險(xiǎn),保障安全
    的頭像 發(fā)表于 11-21 10:58 ?455次閱讀
    Parker派克防爆電機(jī)在實(shí)際應(yīng)用中的<b class='flag-5'>安全</b>性能如何<b class='flag-5'>保證</b>?

    AWR1843 DMM接口介紹驗(yàn)證測試

    電子發(fā)燒友網(wǎng)站提供《AWR1843 DMM接口介紹驗(yàn)證測試.pdf》資料免費(fèi)下載
    發(fā)表于 09-27 10:26 ?0次下載
    AWR1843 DMM接口<b class='flag-5'>介紹</b>和<b class='flag-5'>驗(yàn)證</b>測試