Offset2lib 攻擊繞過 64 位 Linux 內核防護

2021-01-10 開源中國

安全研究人員Hector Marco發布公布了針對64位Linux內核的ASLR防護的繞過,slide和論文提供下載,這種攻擊被稱為offset2lib,ASLR的實現是在Linux內核裡,而在GNU/Linux發行版上加載一個應用程式到內存中會先找一個隨機的地址加載第一個共享庫,之後加載的共享庫緊跟之前加載對象的地址,一個內存地址的洩漏就足夠讓地址隨機化變得無用,甚至GOT(Global Offset Table)的地址洩漏都不是必須的,由於大部分的GNU/Linux發行版(除了像Gentoo這種每個源碼包都需要自己編譯)的包都是預編譯的二進位文件,所以這些發行版的offset都是一樣的。作者的POC中是輕鬆的繞過了NX(stack上不允許執行),ASLR(地址隨機化)+PIE(針對代碼段的隨機化),SSP(壓棧出棧檢測是否被修改的canary)的組合防禦,offset2lib攻擊為繞過普通的GNU/Linux針對漏洞的整體防禦給以了致命的一擊。

這次offset2lib的曝光引起了0ld sch00l黑客社區的廣泛討論,多年來Linux內核開發者社區的自大是導致這種程度攻擊的主要原因,多年來的「修修補補」式的防禦設計在一夜之間居然崩潰掉了,甚至有人懷疑這些來自「上古」時代的防禦代碼今天是否還有人記得...雖然offset2lib攻擊在目前的內核代碼裡比較容易修復,但你根本不知道像NSA之類的情報部門是否已經漏洞利用過? 有趣的是這種攻擊方式對於Grsecurity/PaX無效,Grsecurity/PaX早在13年前的實現就已經杜絕了這種攻擊的可能性,不幸的是只有Gentoo和Debian Mempo提供了直接使用Grsecurity/PaX的途徑。當然,為什麼Linux內核社區一直抄襲Grsecurity/PaX而不讓它進入主幹或許是個社區政治問題,但抄的爛也是導致這次攻擊的主要原因。

btw:說普通的GNU/Linux安全是相對於Windows而言。"                  

相關焦點

  • Linux2.6內核驅動移植參考
    作者:晏渭川 隨著Linux2.6的發布,由於2.6內核做了教的改動,各個設備的驅動程序在不同程度上要 進行改寫。為了方便各位Linux愛好者我把自己整理的這分文檔share出來。該文當列舉 了2.6內核同以前版本的絕大多數變化,可惜的是由於時間和精力有限沒有詳細列出各個 函數的用法。
  • linux pwn入門學習到放棄
    ROP繞過DEP和ASLR防護編譯測試用例開啟ASLR後,libc地址會不斷變化,這裡先不討論怎麼獲取真實system地址,用了一個輔助函數列印system地址。/linux_x64_test2 0x7fa84dc3d390Hello, WorldROP簡介ROP的全稱為Return-oriented programming(返回導向編程),是一種高級的內存攻擊技術可以用來繞過現代作業系統的各種通用防禦(比如內存不可執行DEP和代碼籤名等)。
  • Linux 內核學習:環境搭建和內核編譯
    安裝過程中有個提示,問你要選擇哪個內核,我選了"linux-image-3.2.0-4-amd64",沒去研究供選擇的兩個內核有何不同;接下來又提示initrd的選擇,為了節省空間,選擇了"targeted:only "。
  • Linux內核學習:簡單的字符設備驅動
    init.h>#include <linux/module.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/uaccess.h>
  • Linux 內核 TCP MSS 機制詳細分析
    作業系統版本:Ubuntu 18.04 內核版本:4.15.0-20-generic地址:192.168.11.112內核源碼:$ sudo apt install linux-source-4.15.0$ ls /usr/src/linux-source-4.15.0.tar.bz2
  • Ubuntu中升級Linux內核
    在Ubuntu中如何下載4.2內核:  此內核版本的二進位包可供下載連結如下:  Download Kernel 4.2 (.DEB)  首先檢查作業系統類型,32位(i386)的或64位(amd64)的,然後使用下面方式依次下載並安裝軟體包:  1.linux-headers-4.2.0-xxx_all.deb
  • linux內核移植-移植2.6.35.4內核到s3c2440
    本來是想移植最新的內核2.6.39但是總是在編譯快完成的時候報錯,有人說是新的內核對arm平臺的支持不好,所以就降低了一下版本,這裡移植2.6.35.4內核一、準備工作1、下載 解壓內核從官網上下載linux-2.6.35的內核, ftp://ftp.kernel.org/pub/linux/kernel/v2.6/ ,文件不大,約85M。
  • 深入理解Linux內核鍊表
    在Linux內核中使用了大量的鍊表結構來組織數據,包括設備列表以及各種功能模塊中的數據組織。這些鍊表大多採用在[include/linux/list.h]實現的一個相當精彩的鍊表數據結構。本文的後繼部分就將通過示例詳細介紹這一數據結構的組織和使用。
  • linux-3.18內核系統調用
    __NR_syscall_max] = &sys_ni_syscall將數組內容全部初始化為未實現(服務例程沒有實際內容,下邊介紹);然後包含syscalls_64.h的內容逐項初始化,這個文件預先不存在,是在內核編譯期間生成的(請看2.2)。
  • linux-kernel-pwn-csaw-2015-stringipc
    環境的配置(內核編譯以及製作文件系統)以及ko的編譯可以參照基礎知識[2]這一個章節。我的環境是內核linux-4.4.110[3],文件系統是busybox-1.31.0[4]。$ ldd sudo_timer linux-vdso.so.1(0x00007ffd0c9e3000) libc.so.6=> /lib/x86_64-linux-gnu/libc.so.6(0x00007f1b48c2a000)/lib64/ld-linux-x86-64.so.2(0x00007f1b4921d000
  • 淺談分析Arm linux 內核移植及系統初始化的過程二
    ,},[2]={.name ="S3C2410flashpartition2",.offset=SZ_4M,.size =SZ_4M,},[3]={.name ="S3C2410flashpartition3",.offset =SZ_8M,.size =SZ_2M,},[4]={.name ="
  • Gear-Lib 1.1.13 發布,適合 IOT 開發的 C 庫
    libdict: 哈希字典 libhash: linux內核原生哈希庫 libringbuffer: 循環緩衝 >libqueue: 數據隊列 librbtree: 內核rbtree libsort: libvector: 容器庫 libmacro: 通用宏定義 libdarray: 動態數組
  • 一個令人驚嘆的Linux內核補丁
    mapping->a_ops->is_partially_uptodate(page, offset, iter->count)) goto page_not_up_to_date_locked;
  • 當運行 Linux 內核的機器死機時……
    Linux 內核在發生 soft lockup 的時候,是可以 ping 通的,只要沒有關中斷,ping 通一般沒有問題。既然可以 ping 通,何必不帶回一些真正重要的信息而不僅僅是 echo 的 reply?且慢,你可能會覺得這一切沒有意義,懂 kdump 的人都會這麼抬槓,畢竟如果這個時候讓內核 panic 掉,保留一個 vmcore,事後便可以隨便分析了。
  • Linux-5.6.6 內核引導
    2. BIOS初始化,檢查硬體,尋找可引導設備,跳轉至引導扇區代碼(boot.img)。3. core image的初始化代碼將剩餘的core image(包含GRUB 2的內核代碼和文件系統驅動)加載到內存中,運行grub_main。內核自帶bootloader,但是新版本內核已經棄用。
  • Java離Linux內核有多遠?
    const_progname : *margv, (const_launcher != NULL) ?) dlsym(libjvm, "JNI_GetDefaultJavaVMInitArgs"); ifn->GetCreatedJavaVMs = (GetCreatedJavaVMs_t) dlsym(libjvm, "JNI_GetCreatedJavaVMs"); return JNI_TRUE;}d
  • CentOS 7.4 同時安裝32位64位wine 3.0
    本文操作是在64位CentOS 7.4系統下進行。所有操作借鑑網絡多篇文章操作方法綜合而成。devel libxslt-devel freetype-devel flex bisonyum -y install alsa-lib-devel.i686 libsndfile-devel.i686 readline-devel.i686 glib2.i686 glibc-devel.i686
  • Linux Kernel Pwn_2_Kernel UAF
    .ko文件在/lib/modules/4.4.72/babydriver.ko。gt;&1 || return 1 cat $1 exit 0}try_decompress(){ # The obscure use of the "tr" filter is to work around older versions of # "grep" that report the byte offset of the line instead
  • 嵌入式Linux內核啟動主要分為這三個階段
    一、Linux內核自解壓過程  在linux內核啟動過程中一般能看到圖1內核自解壓界面,這裡重點討論內核的自解壓過程。  圖2 機器碼不匹配錯誤  三、Linux內核啟動第二階段stage2  從start_kernel函數開始  Linux內核啟動的第二階段從start_kernel函數開始。