色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

保證BPF程序安全的BPF驗證器介紹

Linux閱碼場 ? 來源:Linux內核之旅 ? 作者:梁金榮 ? 2021-05-03 11:27 ? 次閱讀

1. 前言

我們可以使用BPF對Linux內核進行跟蹤,收集我們想要的內核數據,從而對Linux中的程序進行分析和調試。與其它的跟蹤技術相比,使用BPF的主要優點是幾乎可以訪問Linux內核和應用程序的任何信息,同時,BPF對系統性能影響很小,執行效率很高,而且開發人員不需要因為收集數據而修改程序。

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

2. BPF驗證器

BPF借助跟蹤探針收集信息并進行調試和分析,與其它依賴于重新編譯內核的工具相比,BPF程序的安全性更高。重新編譯內核引入外部模塊的方式,可能會因為程序的錯誤而產生系統奔潰。BPF程序的驗證器會在BPF程序加載到內核之前分析程序,消除這種風險。

BPF驗證器執行的第一項檢查是對BPF虛擬機加載的代碼進行靜態分析,目的是確保程序能夠按照預期結束。驗證器在進行第一項檢查時所做工作為:

程序不包含控制循環;

程序不會執行超過內核允許的最大指令數;

程序不包含任何無法到達的指令;

程序不會超出程序界限。

BPF驗證器執行的第二項檢查是對BPF程序進行預運行,所做工作為:

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

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

預運行將程序控制流的執行結果通知驗證器,確保BPF程序最終都會執行BPF_EXIT指令。

3. 內核探針 kprobes

內核探針可以跟蹤大多數內核函數,并且系統損耗最小。當跟蹤的內核函數被調用時,附加到探針的BPF代碼將被執行,之后內核將恢復正常模式。

3.1 kprobes類BPF程序的優缺點

優點 動態跟蹤內核,可跟蹤的內核函數眾多,能夠提取內核絕大部分信息。

缺點 沒有穩定的應用程序二進制接口,可能隨著內核版本的演進而更改。

3.2 kprobes

kprobe程序允許在執行內核函數之前插入BPF程序。當內核執行到kprobe掛載的內核函數時,先運行BPF程序,BPF程序運行結束后,返回繼續開始執行內核函數。下面是一個使用kprobe的bcc程序示例,功能是監控內核函數kfree_skb函數,當此函數觸發時,記錄觸發它的進程pid,進程名字和觸發次數,并打印出觸發此函數的進程pid,進程名字和觸發次數:

#!/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,并進行數據處理。c部分會被llvm編譯器編譯為BPF字節碼,經過BPF驗證器驗證安全后,加載到內核中執行。python和c中出現的陌生函數可以查下面這兩個手冊,在此不再贅述:

python部分遇到的陌生函數可以查這個手冊: 點此跳轉

c部分中遇到的陌生函數可以查這個手冊: 點此跳轉

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

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

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

event=“kfree_skb”指定了kprobe掛載的內核函數為kfree_skb;

fn_name=“trace_kfree_skb”指定了當檢測到內核函數kfree_skb時,執行程序中的trace_kfree_skb函數;

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

程序運行結果如下:

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

3.3 kretprobes

相比于內核探針kprobe程序,kretprobe程序是在內核函數有返回值時插入BPF程序。當內核執行到kretprobe掛載的內核函數時,先執行內核函數,當內核函數返回時執行BPF程序,運行結束后返回。

以上面的BPF程序為例,若要使用kretprobe,可以這樣修改:

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

b.attach_kretprobe()指定了該BPF程序類型為kretprobe,kretprobe類型的BPF程序將在跟蹤的內核函數有返回值時執行BPF程序;

event=“kfree_skb”指定了kretprobe掛載的內核函數為kfree_skb;

fn_name=“trace_kfree_skb”指定了當內核函數kfree_skb有返回值時,執行程序中的trace_kfree_skb函數;

4. 內核靜態跟蹤點 tracepoint

tracepoint是內核靜態跟蹤點,它與kprobe類程序的主要區別在于tracepoint由內核開發人員在內核中編寫和修改。

4.1 tracepoint 程序的優缺點

優點 跟蹤點是靜態的,ABI更穩定,不隨內核版本的變化而致不可用。

缺點 跟蹤點是內核人員添加的,不會全面涵蓋內核的所有子系統。

4.2 tracepoint 可用跟蹤點

系統中所有的跟蹤點都定義在/sys/kernel/debug/traceing/events目錄中:

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

使用命令perf list 也可以列出可使用的tracepoint點:

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

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

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

bcc遵循tracepoint命名約定,首先是指定要跟蹤的子系統,這里是“skb:”,然后是子系統中的跟蹤點“kfree_skb”:

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

5. 總結

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

原文標題:梁金榮:使用eBPF追蹤LINUX內核

文章出處:【微信公眾號:Linuxer】歡迎添加關注!文章轉載請注明出處。

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 內核
    +關注

    關注

    3

    文章

    1372

    瀏覽量

    40282
  • Linux
    +關注

    關注

    87

    文章

    11296

    瀏覽量

    209357
收藏 人收藏

    評論

    相關推薦

    如何進行電子連接的測試與驗證

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

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

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

    電子設備濾波的種類 影響水質的濾波類型

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

    Parker派克防爆電機在實際應用中的安全性能如何保證

    Parker防爆電機通過防爆外殼、國際安全標準、專用防爆認證、低火花設計、定制化繞組、應用案例驗證及溫度管理,確保實際應用中的安全性能,防止爆炸風險,保障安全
    的頭像 發表于 11-21 10:58 ?88次閱讀
    Parker派克防爆電機在實際應用中的<b class='flag-5'>安全</b>性能如何<b class='flag-5'>保證</b>?

    AWR1843 DMM接口介紹驗證測試

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

    內核程序漏洞介紹

    電子發燒友網站提供《內核程序漏洞介紹.pdf》資料免費下載
    發表于 08-12 09:38 ?0次下載

    BPF-F1250+帶通濾波規格書

    AD品牌電子元器件
    發表于 07-17 12:55 ?0次下載

    西門子推出Solido IP驗證套件,為下一代IC設計提供端到端的芯片質量保證

    西門子集成的驗證套件能夠在整個IC設計周期內提供無縫的IP質量保證,為IP開發團隊提供完整的工作流程 西門子工業軟件日前推出Solido?IP驗證套件(Solido IP Validation
    發表于 05-24 10:36 ?396次閱讀

    請問NFC數據傳輸如何保證數據安全

    NFC數據傳輸如何保證數據安全
    發表于 04-07 06:18

    奇瑞汽車股份有限公司發布“數據驗證方法、設備、服務及存儲介質”

    該專利涉及車聯網科技領域,具體而言是一套數據驗證程序,包括提取車輛設備的標識符和接入時刻,然后據此生成校驗令牌,以作證服務與設備間數據交互的安全性。相比既有的技術,這種方法更能有效防
    的頭像 發表于 03-19 16:53 ?747次閱讀
    奇瑞汽車股份有限公司發布“數據<b class='flag-5'>驗證</b>方法、設備、服務<b class='flag-5'>器</b>及存儲介質”

    探索aarch64架構上使用ftrace的BPF LSM

    筆者在MacBook M2上搭建Linux虛擬機上開發eBPF程序時,遇到一些LSM eBPF類型程序無法運行的問題,哪怕是5.15內核的ubuntu server,依舊無法正常運行。顯然
    的頭像 發表于 01-25 09:30 ?724次閱讀

    基于功能安全的汽車嵌入式軟件單元驗證技術研究

    ,對滿足功能安全ASIL等級的汽車嵌入式軟件單元驗證技術進行詳細介紹,從而提高軟件質量,減少軟件安全隱患,對汽車嵌入式軟件開發和測試工作具有一定的指導意義。
    的頭像 發表于 01-07 11:27 ?1049次閱讀
    基于功能<b class='flag-5'>安全</b>的汽車嵌入式軟件單元<b class='flag-5'>驗證</b>技術研究

    RZ/G驗證的Linux軟件包V2.1.20-RT 修補程序應用指南

    電子發燒友網站提供《RZ/G驗證的Linux軟件包V2.1.20-RT 修補程序應用指南.pdf》資料免費下載
    發表于 01-03 14:12 ?0次下載
    RZ/G<b class='flag-5'>驗證</b>的Linux軟件包V2.1.20-RT 修補<b class='flag-5'>程序</b>應用指南

    來自“理工男”的安全守護!星紀元ET通過“NESTA 六維電安全”技術驗證

    安全是一切技術的保障,也是奇瑞對用戶始終如一的承諾!“理工男”傳承26年的安全基因,在“塔尖明珠”星途星紀元上體現得更加淋漓盡致。 12月29日,中汽中心公布最新消息,根據新能源汽車電安全技術
    的頭像 發表于 01-02 15:15 ?475次閱讀
    來自“理工男”的<b class='flag-5'>安全</b>守護!星紀元ET通過“NESTA 六維電<b class='flag-5'>安全</b>”技術<b class='flag-5'>驗證</b>

    AtomGit教程 | 使用AtomGit雙因素驗證保障您的賬戶安全

    。 本文將向您介紹雙因素認證的概念、優勢以及AtomGit雙因素驗證的使用 。 什么是雙因素認證? 雙因素認證,也稱為兩步驗證,是一種安全認證方法。它結合了兩種不同形式的認證方式來確認
    的頭像 發表于 12-28 15:55 ?611次閱讀
    AtomGit教程 | 使用AtomGit雙因素<b class='flag-5'>驗證</b>保障您的賬戶<b class='flag-5'>安全</b>
    主站蜘蛛池模板: 国产1广场舞丰满老女偷| 国产在线精品亚洲| 亚洲第一免费播放区| 久久99r66热这里只有精品| 97视频在线观看视频最新| 日韩欧美中文字幕在线二视频 | 美女教师朝桐光在线播放| 成人永久免费视频| 97人妻无码AV碰碰视频| 秋霞伦理高清视频在线| 黄色a三级三级三级免费看| 97色伦亚洲自偷| 午夜视频无码国产在线观看| 浪荡女天天不停挨CAO日常视| 二级毛片免费观看全程| 中国二级毛片| 亚洲国产日韩欧美在线a乱码| 欧美国产成人在线| 久久精品国产亚洲AV未满十八| 俄罗斯xxxxxbbbbb| 手机看片国产日韩欧美| 丹麦1o一19sex性hdhd| 俄罗斯兽交XXXXX在线| 老熟女重囗味GRANNYBBW| 国产精品日本欧美一区二区| 99久久爱看免费观看| 伊人久久网国产伊人| 羞羞漫画在线播放| 无码AV熟妇素人内射V在线| 日本熟妇多毛XXXXX视频| 免费完整版观看| 蜜桃狠狠色伊人亚洲综合网站| 果冻传媒在线完整免费播放| 国产白丝精品爽爽久久蜜臀 | 漂亮的av女演员| 男人桶爽女人| 男人J进入女人P免费狂躁| 久久AV国产麻豆HD真实乱| 囯产精品一品二区三区| 俄罗斯14一18处交| 成人伦理影院|