日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

在Linux内核使用Kasan

發布時間:2023/12/20 linux 51 豆豆
生活随笔 收集整理的這篇文章主要介紹了 在Linux内核使用Kasan 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

昨天的文章發出來后,有同學在群里說內核也可以使用這個工具,所以再轉發一篇wowo網站的文章,希望對大家有幫助。

Linux 應用調試神器- ASan

1. 前言

KASAN是一個動態檢測內存錯誤的工具。KASAN可以檢測全局變量、棧、堆分配的內存發生越界訪問等問題。功能比SLUB DEBUG齊全并且支持實時檢測。越界訪問的嚴重性和危害性通過我之前的文章(SLUB DEBUG技術)應該有所了解。正是由于SLUB DEBUG缺陷,因此我們需要一種更加強大的檢測工具。難道你不想嗎?KASAN就是其中一種。KASAN的使用真的很簡單。但是我是一個追求刨根問底的人。僅僅止步于使用的層面,我是不愿意的,只有更清楚的了解實現原理才能更加熟練的使用工具。不止是KASAN,其他方面我也是這么認為。但是,說實話,寫這篇文章是有點底氣不足的。因為從我查閱的資料來說,國內沒有一篇文章說KASAN的工作原理,國外也是沒有什么文章關注KASAN的原理。大家好像都在說How to use。

由于本人水平有限,就根據現有的資料以及自己閱讀代碼揣摩其中的意思。本文章作為拋準引玉,如果有不合理的地方還請指正。

注:文章代碼分析基于linux-4.15.0-rc3。

2. 簡介

KernelAddressSANitizer(KASAN)是一個動態檢測內存錯誤的工具。它為找到use-after-free和out-of-bounds問題提供了一個快速和全面的解決方案。KASAN使用編譯時檢測每個內存訪問,因此您需要GCC 4.9.2或更高版本。檢測堆棧或全局變量的越界訪問需要GCC 5.0或更高版本。目前KASAN僅支持x86_64和arm64架構(linux 4.4版本合入)。你使用ARM64架構,那么就需要保證linux版本在4.4以上。當然了,如果你使用的linux也有可能打過KASAN的補丁。例如,使用高通平臺做手機的廠商使用linux 3.18同樣支持KASAN。


3. 如何使用

使用KASAN工具是比較簡單的,只需要添加kernel以下配置項。

CONFIG_SLUB_DEBUG=y

CONFIG_KASAN=y

為什么這里必須打開SLUB_DEBUG呢?是因為有段時間KASAN是依賴SLUBU_DEBUG的,什么意思呢?就是在Kconfig中使用了depends on,明白了吧。不過最新的代碼已經不需要依賴了,可以看下提交。但是我建議你打開該選項,因為log可以輸出更多有用的信息。重新編譯kernel即可,編譯之后你會發現boot.img(Android環境)大小大了一倍左右。所以說,影響效率不是沒有道理的。不過我們可以作為產品發布前的最后檢查,也可以排查越界訪問等問題。我們可以查看內核日志內容是否包含KASAN檢查出的bugs信息。


4. KASAN是如何實現檢測的?

KASAN的原理是利用額外的內存標記可用內存的狀態。這部分額外的內存被稱作shadow memory(影子區)。KASAN將1/8的內存用作shadow memory。使用特殊的magic num填充shadow memory,在每一次load/store(load/store檢查指令由編譯器插入)內存的時候檢測對應的shadow memory確定操作是否valid。連續8 bytes內存(8 bytes align)使用1 byte shadow memory標記。如果8 bytes內存都可以訪問,則shadow memory的值為0;如果連續N(1 =< N <= 7) bytes可以訪問,則shadow memory的值為N;如果8 bytes內存訪問都是invalid,則shadow memory的值為負數。


?

在代碼運行時,每一次memory access都會檢測對應的shawdow memory的值是否valid。這就需要編譯器為我們做些工作。編譯的時候,在每一次memory access前編譯器會幫我們插入__asan_load##size()或者__asan_store##size()函數調用(size是訪問內存字節的數量)。這也是要求更新版本gcc的原因,只有更新的版本才支持自動插入。


mov x0, #0x5678
movk x0, #0x1234, lsl #16
movk x0, #0x8000, lsl #32
movk x0, #0xffff, lsl #48
mov w1, #0x5
bl __asan_store1
strb w1, [x0]

上面一段匯編指令是往0xffff800012345678地址寫5。在KASAN打開的情況下,編譯器會幫我們自動插入bl __asan_store1指令,__asan_store1函數就是檢測一個地址對應的shadow memory的值是否允許寫1 byte。藍色匯編指令就是真正的內存訪問。因此KASAN可以在out-of-bounds的時候及時檢測。__asan_load##size()和__asan_store##size()的代碼在mm/kasan/kasan.c文件實現。


4.1. 如何根據shadow memory的值判斷內存訪問操作是否valid?


shadow memory檢測原理的實現主要就是__asan_load##size()和__asan_store##size()函數的實現。那么KASAN是如何根據訪問的address以及對應的shadow memory的狀態值來判斷訪問是否合法呢?首先看一種最簡單的情況。訪問8 bytes內存。

long *addr = (long *)0xffff800012345678;
*addr = 0;

以上代碼是訪問8 bytes情況,檢測原理如下:

long *addr = (long *)0xffff800012345678;
char *shadow = (char *)(((unsigned long)addr >> 3) + KASAN_SHADOW_OFFSE);
if (*shadow)
??? report_bug();
*addr = 0;

紅色區域類似是編譯器插入的指令。既然是訪問8 bytes,必須要保證對應的shadow mempry的值必須是0,否則肯定是有問題。那么如果訪問的是1,2 or 4 bytes該如何檢查呢?也很簡單,我們只需要修改一下if判斷條件即可。

修改如下:


if (*shadow && *shadow < ((unsigned long)addr & 7) + N); //N = 1,2,4

如果*shadow的值為0代表8 bytes均可以訪問,自然就不需要report bug。addr & 7是計算訪問地址相對于8字節對齊地址的偏移。還是使用下圖來說明關系吧。假設內存是從地址8~15一共8 bytes。對應的shadow memory值為5,現在訪問11地址。那么這里的N只要大于2就是invalid。


?
4.2. shadow memory內存如何分配?


在ARM64中,假設VA_BITS配置成48。那么kernel space空間大小是256TB,因此shadow memory的內存需要32TB。我們需要在虛擬地址空間為KASAN shadow memory分配地址空間。所以我們有必要了解一下ARM64 memory layout。


基于linux-4.15.0-rc3的代碼分析,我繪制了如下memory layout(VA_BITS = 48)。kernel space起始虛擬地址是0xffff_0000_0000_0000,kernel space被分成幾個部分分別是KASAN、MODULE、VMALLOC、FIXMAP、PCI_IO、VMEMMAP以及linear mapping。其中KASAN的大小是32TB,正好是kernel space大小的1/8。不知道你注意到沒有,KERNEL的位置相對以前是不是有所不一樣。你的印象中,KERNEL是不是位于linear mapping區域,這里怎么變成了VMALLOC區域?這里是Ard Biesheuvel提交的修改。主要是為了迎接ARM64世界的KASLR(which allows the kernel image to be located anywhere in the vmalloc area)的到來。


?
4.3. 如何建立shadow memory的映射關系?


當打開KASAN的時候,KASAN區域位于kernel space首地址處,從0xffff_0000_0000_0000地址開始,大小是32TB。shadow memory和kernel address轉換關系是:shadow_addr = (kaddr >> 3)? + KASAN_SHADOW_OFFSE。為了將[0xffff_0000_0000_0000, 0xffff_ffff_ffff_ffff]和[0xffff_0000_0000_0000, 0xffff_1fff_ffff_ffff]對應起來,因此計算KASAN_SHADOW_OFFSE的值為0xdfff_2000_0000_0000。

我們將KASAN區域放大,如下圖所示。


?

KASAN區域僅僅是分配的虛擬地址,在訪問的時候必須建立和物理地址的映射才可以訪問。上圖就是KASAN建立的映射布局。左邊是系統啟動初期建立的映射。在kasan_early_init()函數中,將所有的KASAN區域映射到kasan_zero_page物理頁面。因此系統啟動初期,KASAN并不能工作。右側是在kasan_init()函數中建立的映射關系,kasan_init()函數執行結束就預示著KASAN的正常工作。我們將不需要address sanitizer功能的區域同樣還是映射到kasan_zero_page物理頁面,并且是readonly。我們主要是檢測kernel和物理內存是否存在UAF或者OOB問題。所以建立KERNEL和linear mapping(僅僅是所有的物理地址建立的映射區域)區域對應的shadow memory建立真實的映射關系。MOUDLE區域對應的shadow memory的映射關系也是需要創建的,但是映射關系建立是動態的,他在module加載的時候才會去創建映射關系。


4.4. 伙伴系統分配的內存的shadow memory值如何填充?


既然shadow memory已經建立映射,接下來的事情就是探究各種內存分配器向shadow memory填充什么數據了。首先看一下伙伴系統allocate page(s)函數填充shadow memory情況。


?

假設我們從buddy system分配4 pages。系統首先從order=2的鏈表中摘下一塊內存,然后根據shadow memory address和memory address之間的對應的關系找對應的shadow memory。這里shadow memory的大小將會是2KB,系統會全部填充0代表內存可以訪問。我們對分配的內存的任意地址內存進行訪問的時候,首先都會找到對應的shadow memory,然后根據shadow memory value判斷訪問內存操作是否valid。

如果釋放pages,情況又是如何呢?


?

同樣的,當釋放pages的時候,會填充shadow memory的值為0xFF。如果釋放之后,依然訪問內存的話,此時KASAN根據shadow memory的值是0xFF就可以斷,這是一個use-after-free問題。


4.5. SLUB分配對象的內存的shadow memory值如何填充?


當我們打開KASAN的時候,SLUB Allocator管理的object layout將會放生一定的變化。如下圖所示。
?


在打開SLUB_DEBUG的時候,object就增加很多內存,KASAN打開之后,在此基礎上又加了一截。為什么這里必須打開SLUB_DEBUG呢?是因為有段時間KASAN是依賴SLUBU_DEBUG的,什么意思呢?就是在Kconfig中使用了depends on,明白了吧。不過最新的代碼已經不需要依賴了,可以看下提交。


當我們第一次創建slab緩存池的時候,系統會調用kasan_poison_slab()函數初始化shadow memory為下圖的模樣。整個slab對應的shadow memory都填充0xFC。


?


上述步驟雖然填充了0xFC,但是接下來初始化object的時候,會改變一些shadow memory的值。我們先看一下kmalloc(20)的情況。我們知道kmalloc()就是基于SLUB Allocator實現的,所以會從kmalloc-32的kmem_cache中分配一個32 bytes object。


?

首先調用kmalloc(20)函數會匹配到kmalloc-32的kmem_cache,因此實際分配的object大小是32 bytes。KASAN同樣會標記剩下的12 bytes的shadow memory為不可訪問狀態。根據object的地址,計算shadow memory的地址,并開始填充數值。由于kmalloc()返回的object的size是32 bytes,由于kmalloc(20)只申請了20 bytes,剩下的12 bytes不能使用。KASAN必須標記shadow memory這種情況。object對應的4 bytes shadow memory分別填充00 00 04 FC。00代表8個連續的字節可以訪問。04代表前4個字節可以訪問。作為越界訪問的檢測的方法。總共加在一起是正好是20 bytes可訪問。0xFC是Redzone標記。如果訪問了Redzone區域KASAN就會檢測out-of-bounds的發生。

當申請使用之后,現在調用kfree()釋放之后的shadow memory情況是怎樣的呢?看下圖。


?


根據object首地址找到對應的shadow memory,32 bytes object對應4 bytes的shadow memory,現在填充0xFB標記內存是釋放的狀態。此時如果繼續訪問object,那么根據shadow memory的狀態值既可以確定是use-after-free問題。


4.6. 全局變量的shadow memory值如何填充?


前面的分析都是基于內存分配器的,Redzone都會隨著內存分配器一起分配。那么global variables如何檢測呢?global variable的Redzone在哪里呢?這就需要編譯器下手了。編譯器會幫我們填充Redzone區域。例如我們定義一個全局變量a,編譯器會幫我們填充成下面的樣子。

char a[4];

轉換

struct{ char original[4]; char redzone[60]; } a;//32 bytes aligned

如果這里你問我為什么填充60 bytes。其實我也不知道。這個轉換例子也是從KASAN作者的PPT中拿過來的。估計要涉及編譯器相關的知識,我無能為力了,但是下面做實驗來猜吧。當然了,PPT的內容也需要驗證才具有說服力。盡信書則不如無書。我特地寫三個全局變量來驗證。發現System.map分配地址之間的差值正好是0x40。因此這里的確是填充60 bytes。


另外從我的測試發現,如果上述的數組a的大小是33的時候,填充的redzone就是63 bytes。所以我推測,填充的原理是這樣的。全局變量實際占用內存總數S(以byte為單位)按照每塊32 bytes平均分成N塊。假設最后一塊內存距離目標32 bytes還差y bytes(if S%32 == 0,y = 0),那么redzone填充的大小就是(y + 32) bytes。畫圖示意如下(S%32 != 0)。因此總結的規律是:redzone = 63 – (S - 1) % 32。


?

全局變量redzone區域對應的shadow memory是在什么填充的呢?又是如何調用的呢?這部分是由編譯器幫我們完成的。編譯器會為每一個全局變量創建一個函數,函數名稱是:

_GLOBAL__sub_I_65535_1_##global_variable_name。

這個函數中通過調用__asan_register_globals()函數完成shadow memory標記。并且將自動生成的這個函數的首地址放在.init_array段。在kernel啟動階段,通過以下代調用關系最終調用所有全局變量的構造函數。kernel_init_freeable()->do_basic_setup() ->do_ctors()。do_ctors()代碼實現如下:

staticvoid __init do_ctors(void) { ctor_fn_t*fn =(ctor_fn_t*) __ctors_start; for(; fn <(ctor_fn_t*) __ctors_end; fn++) (*fn)(); }

這里的代碼意思對于輕車熟路的你再熟悉不過了吧。因為內核中這么搞的太多了。便利__ctors_start和__ctors_end之間的所有數據,作為函數地址進行調用,即完成了所有的global variables的shadow memory初始化。我們可以從鏈接腳本中知道__ctors_start和__ctors_end的意思。


#define KERNEL_CTORS()? . = ALIGN(8);????????????? \
??????????? VMLINUX_SYMBOL(__ctors_start) = .; \
??????????? KEEP(*(.ctors))??????????? \
??????????? KEEP(*(SORT(.init_array.*)))?????? \
??????????? KEEP(*(.init_array))?????????? \
??????????? VMLINUX_SYMBOL(__ctors_end) = .;

上面說了這么多,不知道你是否產生了疑心?怎么都是猜啊!猜的能準確嗎?是的,我也這么覺得。是騾子是馬,拉出來溜溜唄!現在用事實說話。首先我創建一個c文件drivers/input/smc.c。在smc.c文件中創建3個全局變量如下:


?


然后就隨便使用吧!編譯kernel,我們先看看System.map文件中,3個全局變量分配的地址。


ffff200009f540e0 B smc_num1
ffff200009f54120 B smc_num2
ffff200009f54160 B smc_num3


還記得上面說會有一個形如_GLOBAL__sub_I_65535_1_##global_variable_name的函數嗎?在System.map文件文件中,我看到了_GLOBAL__sub_I_65535_1_smc_num1符號。但是沒有smc_num2和smc_num3的構造函數。你是不是很奇怪,不是每一個全局變量都會創建一個類似的構造函數嗎?馬上為你揭曉。我們先執行aarch64-linux-gnu-objdump –s –x –d vmlinux > vmlinux.txt命令得到反編譯文件。現在好多重要的信息在vmlinux.txt。現在主要就是查看vmlinux.txt文件。先看一下_GLOBAL__sub_I_65535_1_smc_num1函數的實現。


ffff200009381df0 <_GLOBAL__sub_I_65535_1_smc_num1>:
ffff200009381df0:?? a9bf7bfd??? stp x29, x30, [sp,#-16]!
ffff200009381df4:?? b0001800??? adrp??? x0, ffff200009682000
ffff200009381df8:?? 91308000??? add x0, x0, #0xc20
ffff200009381dfc:?? d2800061??? mov x1, #0x3??????????????????? // #3
ffff200009381e00:?? 910003fd??? mov x29, sp
ffff200009381e04:?? 9100c000??? add x0, x0, #0x30
ffff200009381e08:?? 97c09fb8??? bl? ffff2000083a9ce8 <__asan_register_globals>
ffff200009381e0c:?? a8c17bfd??? ldp x29, x30, [sp],#16
ffff200009381e10:?? d65f03c0??? ret


匯編和C語言傳遞參數在ARM64平臺使用的是x0~x7。通過上面的匯編計算一下,x0=0xffff200009682c50,x1=3。然后調用__asan_register_globals()函數,x0和x1就是傳遞的參數。我們看一下__asan_register_globals()函數實現。

void __asan_register_globals(struct kasan_global *globals,size_t size) { int i; for(i =0; i < size; i++)register_global(&globals[i]); }

size是3就是要初始化全局變量的個數,所以這里只需要一個構造函數即可。一次性將3個全局變量全部搞定。這里再說一點猜測吧!我猜測是以文件為單位編譯器創建一個構造函數即可,將本文件全局變量一次性全部打包初始化。第一個參數globals是0xffff200009682c50,繼續從vmlinux.txt中查看該地址處的數據。struct kasan_global是編譯器幫我們自動創建的結構體,每一個全局變量對應一個struct kasan_global結構體。struct kasan_global結構體存放的位置是.data段,因此我們可以從.data段查找當前地址對應的數據。

數據如下:


ffff200009682c50 6041f509 0020ffff 07000000 00000000
ffff200009682c60 40000000 00000000 d0d62b09 0020ffff
ffff200009682c70 b8d62b09 0020ffff 00000000 00000000
ffff200009682c80 202c6809 0020ffff 2041f509 0020ffff
ffff200009682c90 1f000000 00000000 40000000 00000000
ffff200009682ca0 e0d62b09 0020ffff b8d62b09 0020ffff
ffff200009682cb0 00000000 00000000 302c6809 0020ffff
ffff200009682cc0 e040f509 0020ffff 04000000 00000000
ffff200009682cd0 40000000 00000000 f0d62b09 0020ffff
ffff200009682ce0 b8d62b09 0020ffff 00000000 00000000

首先ffff200009682c50對應的第一個數據6041f509 0020ffff,這是個啥?其實是一個地址數據,你是不是又疑問了,ARM64的kernel space地址不是ffff開頭嗎?這個怎么60開頭?其實這個地址數據是反過來的,你應該從右向左看。這個地址其實是ffff200009f54160。這不正是smc_num3的地址嘛!解析這段數據之前需要了解一下struct kasan_global結構體。

/* The layout of struct dictated by compiler */ struct kasan_global { constvoid*beg;/* Address of the beginning of the global variable. */ size_t size;/* Size of the global variable. */ size_t size_with_redzone;/* Size of the variable + size of the red zone. 32 bytes aligned */ constvoid*name; constvoid*module_name;/* Name of the module where the global variable is declared. */ unsignedlong has_dynamic_init;/* This needed for C++ */ #if KASAN_ABI_VERSION >= 4 struct kasan_source_location *location; #endif };

第一個成員beg就是全局變量的首地址。跟上面的分析一致。第二個成員size從上面數據看出是7,正好對應我們定義的smc_num3[7],正好7 bytes。size_with_redzone的值是0x40,正好是64。根據上面猜測redzone=63-(7-1)%32=57。加上size正好是64,說明之前猜測的redzone計算方法沒錯。name成員對應的地址是ffff2000092bd6d0。

看下ffff2000092bd6d0存儲的是什么。


ffff2000092bd6d0 736d635f 6e756d33 00000000 00000000? smc_num3........


所以name就是全局變量的名稱轉換成字符串。同樣的方式得到module_name的地址是ffff2000092bd6b8。繼續看看這段地址存儲的數據。


ffff2000092bd6b0 65000000 00000000 64726976 6572732f? e.......drivers/
ffff2000092bd6c0 696e7075 742f736d 632e6300 00000000? input/smc.c.....


一目了然,module_name是文件的路徑。has_dynamic_init的值就是0,這是C++需要的。我用的GCC版本是5.0左右,所以這里的KASAN_ABI_VERSION=4。這里location成員的地址是ffff200009682c20,繼續追蹤該地址的數據。


ffff200009682c20 b8d62b09 0020ffff 0e000000 0f000000


解析這段數據之前要先了解struct kasan_source_location結構體。

/* The layout of struct dictated by compiler */ struct kasan_source_location { constchar*filename; int line_no; int column_no; };

第一個成員filename地址是ffff2000092bd6b8和module_name一樣的數據。剩下兩個數據分別是14和15,分別代表全局變量定義地方的行號和列號。現在回到上面我定義變量的截圖,仔細數數列號是不是15,行號截圖中也有哦!特地截出來給你看的。剩下的struct kasan_global數據就是smc_num1和smc_num2的數據。分析就不說了。前面說_GLOBAL__sub_I_65535_1_smc_num1函數會被自動調用,該地址數據填充在__ctors_start和__ctors_end之間。現在也證明一下觀點。

先從System.map得到符號的地址數據。


ffff2000093ac5d8 T __ctors_start
ffff2000093ae860 T __ctors_end


然后搜索一下_GLOBAL__sub_I_65535_1_smc_num1的地址ffff200009381df0被存儲在什么位置,記得搜索的關鍵字是f01d3809 0020ffff。


ffff2000093ae0c0 f01d3809 0020ffff 181e3809 0020ffff


可以看出ffff2000093ae0c0地址處存儲著_GLOBAL__sub_I_65535_1_smc_num1函數地址。這個地址不是正好位于__ctors_start和__ctors_end之間嘛!


現在就剩下__asan_register_globals()函數到底是是怎么初始化shadow memory的呢?以char a[4]為例,如下圖所示。


?

a[4]只有4 bytes可以訪問,所以對應的shadow memory的第一個byte值是4,后面的redzone就填充0xFA作為越界檢測。a[4]只有4 bytes可以訪問,所以對應的shadow memory的第一個byte值是4,后面的redzone就填充0xFA作為越界檢測。因為這里是全局變量,因此分配的內存區域位于kernel區域。


4.7. 棧分配變量的readzone是如何分配的?


從棧中分配的變量同樣和全局變量一樣需要填充一些內存作為redzone區域。下面繼續舉個例子說明編譯器怎么填充。首先來一段正常的代碼,沒有編譯器的插手。

void foo() { char a[328]; }

再來看看編譯器插了哪些東西進去。

void foo()
{
????char rz1[32];
??? char a[328];
??? char rz2[56];
????int *shadow = (&rz1 >> 3)+ KASAN_SHADOW_OFFSE;
??? shadow[0] = 0xffffffff;
??? shadow[11] = 0xffffff00;
??? shadow[12] = 0xffffffff;
?------------------------使用完畢----------------------------------------?
??? shadow[0] = shadow[11] = shadow[12] = 0;
}

紅色部分是編譯器填充內存,rz2是56,可以根據上一節全局變量的公式套用計算得到。但是這里在變量前面竟然還有32 bytes的rz1。這個是和全局變量的不同,我猜測這里是為了檢測棧變量左邊界越界問題。藍色部分代碼也是編譯器填充,初始化shadow memory。棧的填充就沒有探究那么深入了,有興趣的讀者可以自己探究。


5. Error log信息包含哪些信息?


從kernel的Documentation文檔找份典型的KASAN bug輸出的log信息如下。


==================================================================
BUG: AddressSanitizer:?out of bounds access?in?kmalloc_oob_right+0x65/0x75 [test_kasan] at addr?ffff8800693bc5d3
Write of size 1?by task modprobe/1689
=============================================================================
BUG?kmalloc-128?(Not tainted): kasan error
-----------------------------------------------------------------------------

Disabling lock debugging due to kernel taint
INFO: Allocated in kmalloc_oob_right+0x3d/0x75 [test_kasan] age=0 cpu=0 pid=1689
?__slab_alloc+0x4b4/0x4f0
?kmem_cache_alloc_trace+0x10b/0x190
?kmalloc_oob_right+0x3d/0x75 [test_kasan]
?init_module+0x9/0x47 [test_kasan]
?do_one_initcall+0x99/0x200
?load_module+0x2cb3/0x3b20
?SyS_finit_module+0x76/0x80
?system_call_fastpath+0x12/0x17
INFO: Slab 0xffffea0001a4ef00 objects=17 used=7 fp=0xffff8800693bd728 flags=0x100000000004080
INFO: Object 0xffff8800693bc558 @offset=1368 fp=0xffff8800693bc720

Bytes b4 ffff8800693bc548: 00 00 00 00 00 00 00 00 5a 5a 5a 5a 5a 5a 5a 5a? ........ZZZZZZZZ
Object?ffff8800693bc558: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc568: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc578: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc588: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc598: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc5a8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc5b8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b? kkkkkkkkkkkkkkkk
Object ffff8800693bc5c8: 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b 6b a5? kkkkkkkkkkkkkkk.
Redzone ffff8800693bc5d8: cc cc cc cc cc cc cc cc????????????????????????? ........
Padding ffff8800693bc718: 5a 5a 5a 5a 5a 5a 5a 5a????????????????????????? ZZZZZZZZ
CPU: 0 PID: 1689 Comm: modprobe Tainted: G??? B????????? 3.18.0-rc1-mm1+ #98
Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.7.5-0-ge51488c-20140602_164612-nilsson.home.kraxel.org 04/01/2014
?ffff8800693bc000 0000000000000000 ffff8800693bc558 ffff88006923bb78
?ffffffff81cc68ae 00000000000000f3 ffff88006d407600 ffff88006923bba8
?ffffffff811fd848 ffff88006d407600 ffffea0001a4ef00 ffff8800693bc558
Call Trace:
?[<ffffffff81cc68ae>] dump_stack+0x46/0x58
?[<ffffffff811fd848>] print_trailer+0xf8/0x160
?[<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
?[<ffffffff811ff0f5>] object_err+0x35/0x40
?[<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
?[<ffffffff8120b9fa>] kasan_report_error+0x38a/0x3f0
?[<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
?[<ffffffff8120b344>] ? kasan_unpoison_shadow+0x14/0x40
?[<ffffffff8120a79f>] ? kasan_poison_shadow+0x2f/0x40
?[<ffffffffa00026a7>] ? kmem_cache_oob+0xc3/0xc3 [test_kasan]
?[<ffffffff8120a995>] __asan_store1+0x75/0xb0
?[<ffffffffa0002601>] ? kmem_cache_oob+0x1d/0xc3 [test_kasan]
?[<ffffffffa0002065>] ? kmalloc_oob_right+0x65/0x75 [test_kasan]
?[<ffffffffa0002065>] kmalloc_oob_right+0x65/0x75 [test_kasan]
?[<ffffffffa00026b0>] init_module+0x9/0x47 [test_kasan]
?[<ffffffff810002d9>] do_one_initcall+0x99/0x200
?[<ffffffff811e4e5c>] ? __vunmap+0xec/0x160
?[<ffffffff81114f63>] load_module+0x2cb3/0x3b20
?[<ffffffff8110fd70>] ? m_show+0x240/0x240
?[<ffffffff81115f06>] SyS_finit_module+0x76/0x80
?[<ffffffff81cd3129>] system_call_fastpath+0x12/0x17
Memory state around the buggy address:
?ffff8800693bc300: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
?ffff8800693bc380: fc fc 00 00 00 00 00 00 00 00 00 00 00 00 00 fc
?ffff8800693bc400: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
?ffff8800693bc480: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
?ffff8800693bc500: fc fc fc fc fc fc fc fc fc fc fc?00 00 00 00 00
>ffff8800693bc580:?00 00 00 00 00 00 00 00 00 00?03?fc fc fc fc fc
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ???^
?ffff8800693bc600: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
?ffff8800693bc680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
?ffff8800693bc700: fc fc fc fc fb fb fb fb fb fb fb fb fb fb fb fb
?ffff8800693bc780: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
?ffff8800693bc800: fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb fb
==================================================================


輸出的信息很豐富,包含了bug發生的類型、SLUB輸出的object內存信息、Call Trace以及shadow memory的狀態值。其中紅色信息都是比較重要的信息。我沒有寫demo歷程,而是找了一份log信息,不是我想偷懶,而是鍛煉自己。怎么鍛煉呢?我想問的是,從這份log中你可以推測代碼應該是怎么樣的?

我可以得到一下信息:

1)?程序是通過kmalloc接口申請內存的;
2)?申請的內存大小是123 bytes,即p = kamlloc(123);
3)?代碼中類似往p[123]中寫1 bytes導致越界訪問的bug;
4)?在3)步驟發生前沒有任何的對該內存的寫操作;

如果你也能得到以上4點猜測,我覺的我寫的這幾篇文章你是真的看明白了。首先輸出信息是有SLUB的信息,所以應該是通過kmalloc()接口;在打印的shadow memory的值中,我們看到連續的15個0和一個3,所以申請的內存size就是15x8+3=123;由于是往ffff8800693bc5d3地址寫1個字節,并且object首地址是ffff8800693bc558,所以推測是往p[123]寫1 byte出問題;由于log中將object中所有的128 bytes數據全部打印出來,一共是127個0x6b和一個0xa5(SLUB DEBUG文章介紹的內容)。所以我推測在3)步驟發生前沒有任何的對該內存的寫操作。?

6. 補充

我看了linux-4.18的代碼,KASAN的log輸出已經發生了部分變化。例如:上面舉例的SLUB的object的內容就不會打印了。我們用一下的程序展示這些變化(實際上就是上面舉例用的程序)。

static noinline void __init kmalloc_oob_right(void) { char*ptr; size_t size =123;ptr = kmalloc(size, GFP_KERNEL); if(!ptr){pr_err("Allocation failed\n"); return;}ptr[size]='x';kfree(ptr); }

針對以上代碼,KASAN檢測到bug后的輸出log如下:

================================================================== BUG: KASAN: slab-out-of-bounds in kmalloc_oob_right+0x6c/0x8c Write of size 1 at addr ffffffc0cb114d7b by task swapper/0/1 CPU: 4 PID: 1 Comm: swapper/0 Tainted: G S W 4.9.82-perf+ #310 Hardware name:QualcommTechnologies,Inc. SDM632 PMI632 Call trace: [<ffffff90cf88d9f8>] dump_backtrace+0x0/0x320 [<ffffff90cf88dd2c>] show_stack+0x14/0x20 [<ffffff90cfdd1148>] dump_stack+0xa8/0xd0 [<ffffff90cfabf298>] print_address_description+0x60/0x250 [<ffffff90cfabf6a0>] kasan_report.part.2+0x218/0x2f0 [<ffffff90cfabfac0>] kasan_report+0x20/0x28 [<ffffff90cfabdc64>] __asan_store1+0x4c/0x58 [<ffffff90d1a4f760>] kmalloc_oob_right+0x6c/0x8c [<ffffff90d1a50448>] kmalloc_tests_init+0xc/0x68 [<ffffff90cf8845dc>] do_one_initcall+0xa4/0x1f0 [<ffffff90d1a011ac>] kernel_init_freeable+0x244/0x300 [<ffffff90d0d6da70>] kernel_init+0x10/0x110 [<ffffff90cf8842a0>] ret_from_fork+0x10/0x30 Allocatedby task 1:kasan_kmalloc+0xd8/0x188kmem_cache_alloc_trace+0x130/0x248 kmalloc_oob_right+0x4c/0x8ckmalloc_tests_init+0xc/0x68do_one_initcall+0xa4/0x1f0kernel_init_freeable+0x244/0x300kernel_init+0x10/0x110 ret_from_fork+0x10/0x30 Freedby task 1:kasan_slab_free+0x88/0x178kfree+0x84/0x298 kobject_uevent_env+0x144/0x620kobject_uevent+0x10/0x18device_add+0x5f8/0x860amba_device_try_add+0x22c/0x2f8amba_device_add+0x20/0x128 of_platform_bus_create+0x390/0x478of_platform_bus_create+0x21c/0x478of_platform_populate+0x4c/0xb8of_platform_default_populate_init+0x78/0x8cdo_one_initcall+0xa4/0x1f0 kernel_init_freeable+0x244/0x300kernel_init+0x10/0x110ret_from_fork+0x10/0x30 The buggy address belongs to the object at ffffffc0cb114d00 which belongs to the cache kmalloc-128 of size 128 The buggy address is located 123 bytes inside of 128-byte region [ffffffc0cb114d00, ffffffc0cb114d80) The buggy address belongs to the page: page:ffffffbf032c4500 count:1 mapcount:0 mapping:(null) index:0xffffffc0cb115200 compound_mapcount:0 flags: 0x4080(slab|head) page dumped because: kasan: bad access detected Memory state around the buggy address:ffffffc0cb114c00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ffffffc0cb114c80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc >ffffffc0cb114d00:00000000000000000000000000000003 ^ffffffc0cb114d80: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fcffffffc0cb114e00: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc ==================================================================

我們從上面的log可以分析如下數據:

  • line2:發生越界訪問位置。

  • line3:越界寫1個字節,寫的地址是0xffffffc0cb114d7b。當前進程是comm是swapper/0,pid是1。

  • line7:Call trace,方便定位出問題的函數調用關系。

  • line22:該object分配的調用棧,并指出分配內存的進程pid是1。

  • line32:釋放該object的調用棧(上次釋放),并指出釋放內存的進程pid是1。

  • line49:指出slub相關的信息,從“kmalloc-28”的kmem_cache分配的object。object起始地址是0xffffffc0cb114d00。

  • line51:訪問出問題的地址位于object起始地址偏移123 bytes的位置。object的地址范圍是[0xffffffc0cb114d00, 0xffffffc0cb114d80)。object實際大小是128 bytes。

  • line61:出問題地址對應的shadow memory的值,可以確定申請內存的實際大小是123 bytes。

參考文獻:


1.How to use KASAN to debug memory corruption in OpenStack environment.pdf

2.KernelAddressSanitizer (KASan) a fast memory error detector for the Linux kernel.pdf

原創文章,轉發請注明出處。蝸窩科技,www.wowotech.net。

整理:寫代碼的籃球球癡


推薦閱讀:

專輯|Linux文章匯總

專輯|程序人生

專輯|C語言

我的知識小密圈

關注公眾號,后臺回復「1024」獲取學習資料網盤鏈接。

歡迎點贊,關注,轉發,在看,您的每一次鼓勵,我都將銘記于心~

嵌入式Linux

微信掃描二維碼,關注我的公眾號

總結

以上是生活随笔為你收集整理的在Linux内核使用Kasan的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

日日操操 | 黄色av网站在线观看 | 精品国产亚洲一区二区麻豆 | 亚洲成av人片在线观看无 | 亚洲综合色站 | 国产精品videoxxxx | 97成人在线观看视频 | 久久精品这里精品 | 亚洲精品欧美精品 | 国产成人精品一区二区在线观看 | 中文字幕首页 | 亚洲一区 影院 | 欧美激情精品久久 | 久草在线免费在线观看 | 色久五月 | a天堂在线看 | 国产精品毛片一区二区三区 | 国产日韩欧美在线一区 | 91porny九色在线播放 | 久草久草在线 | 亚洲高清不卡av | 2022国产精品视频 | 999色视频 | 成片人卡1卡2卡3手机免费看 | 黄色av电影在线 | 中文字幕在线人 | 久久精品在线视频 | 国产一级视频免费看 | 欧美日韩国产亚洲乱码字幕 | 欧美成人精品在线 | 欧美日韩精品在线观看 | 国产精品久久久久久久久久99 | 91九色视频网站 | 91免费观看网站 | 国产成人一二片 | 久久嗨| 91精品国产九九九久久久亚洲 | 在线观看免费色 | 视频在线91| 国产最新视频在线观看 | 国产一区二区久久久 | 成人免费观看网站 | 国产一区二区三区黄 | 亚洲精品资源在线 | 欧美国产日韩在线视频 | 久久69av | 欧美亚洲专区 | 中文永久字幕 | 四虎国产永久在线精品 | 欧美一级免费片 | 久久久精品午夜 | 日韩狠狠操 | 国产五月 | 免费试看一区 | 国产在线1区| 国产在线观看你懂得 | 天天se天天cao天天干 | mm1313亚洲精品国产 | 国产一级淫片在线观看 | 韩日成人av | 麻豆果冻剧传媒在线播放 | 婷婷色在线视频 | 久久久久国产成人精品亚洲午夜 | 91精品免费| 国产精品美女在线 | 欧美午夜激情网 | 久久国产精品区 | 婷婷丁香自拍 | 日韩高清在线不卡 | 色av色av色av | 免费看片网址 | 亚洲黄色一级电影 | 91尤物国产尤物福利在线播放 | 999精品| 日韩 国产| 99热只有精品在线观看 | 国产99久久精品一区二区永久免费 | a资源在线 | 欧美一区中文字幕 | 日韩国产高清在线 | 亚洲第一香蕉视频 | 国产在线中文字幕 | 狠狠88综合久久久久综合网 | 天天色天天操天天爽 | 9999国产精品 | 中文字幕免费高清 | 美女在线观看av | 国产九九在线 | 久久国产精品99国产 | 国产精品久久久久久麻豆一区 | 国产成人一区二区三区电影 | 久草视频在线播放 | 国产日韩欧美在线观看视频 | 久久精品人 | 色狠狠操| 岛国一区在线 | 日韩激情在线 | 日日干天天干 | 婷婷国产一区二区三区 | 99性视频| 99热在线国产精品 | 欧美亚洲一级片 | 91在线国产观看 | 日韩av高清在线观看 | 久草网站在线观看 | 2021国产在线视频 | 日韩av免费大片 | 91麻豆精品国产91久久久久久久久 | 久久一级电影 | 免费久久久 | 成人黄色电影在线观看 | 免费在线 | a级国产毛片| 久久中文字幕视频 | 久久综合网色—综合色88 | 亚洲一二三区精品 | 四虎4hu永久免费 | 国产精品日韩欧美 | 美州a亚洲一视本频v色道 | 在线一二三区 | 99久久精品免费看国产四区 | 久久草| 亚洲精品成人在线 | 91最新视频 | 8x成人免费视频 | 欧美午夜一区二区福利视频 | 色就是色综合 | 日韩一二区在线 | 日女人电影| 中文字幕在线看视频国产中文版 | 在线99热 | 欧美精品久久久久性色 | 91超碰免费在线 | 成 人 黄 色 视频播放1 | av福利在线导航 | 最新久久久| 在线免费黄色av | 中国一级片在线 | 91精品老司机久久一区啪 | 亚洲女裸体 | 五月婷婷激情五月 | 欧美激情另类文学 | 四虎影视8848dvd| 日韩高清在线一区二区 | 夜夜躁天天躁很躁波 | 狠狠色噜噜狠狠狠狠2021天天 | 国产中文欧美日韩在线 | 亚洲精品日韩在线观看 | 欧美日韩精品免费观看视频 | 成人黄色电影视频 | 国产人在线成免费视频 | 国产色拍拍拍拍在线精品 | 国产一区私人高清影院 | 日韩视频图片 | 日批网站免费观看 | 久久欧美精品 | 一区二区三区高清不卡 | 婷婷国产在线 | 激情综合五月天 | 国产精品一区久久久久 | 国产黑丝一区二区 | 久久免视频 | 成人资源在线播放 | 欧美在线视频第一页 | 欧美在线一二区 | 国产精品综合在线观看 | 欧美另类重口 | 精品福利视频在线观看 | 超碰97国产| 久久九九九九 | 日韩午夜大片 | 色99之美女主播在线视频 | 亚洲 欧美 91 | 黄色av免费看 | 96av麻豆蜜桃一区二区 | 国产色女人 | 国产精品理论在线观看 | 97在线精品视频 | 69人人 | 草久久久| 亚洲精品小视频 | 久久久久国产成人精品亚洲午夜 | 视频在线99re | 久久99精品久久只有精品 | 国产精品一区二区久久久 | 亚洲精品黄色 | 三级黄色网址 | 亚洲精品在线观看中文字幕 | 这里只有精品视频在线观看 | 国产精品美女久久 | 国产亚洲一区 | 日韩视频中文字幕 | 粉嫩一二三区 | 91精品视频免费观看 | 一区二区三区日韩视频在线观看 | 四虎在线观看网址 | 黄色三级网站 | 91精品在线播放 | 天天射天天操天天干 | 免费在线观看污网站 | 国产伦理剧 | 色诱亚洲精品久久久久久 | 久久av影院 | 麻豆视频在线观看免费 | 国产精品日韩久久久久 | 国内精品在线观看视频 | 91福利区一区二区三区 | 欧美激情视频一区二区三区免费 | 久久久久久蜜桃一区二区 | 日日干干 | 日韩二区三区在线 | 在线观看免费视频你懂的 | 国产资源精品在线观看 | 中文字幕在线国产 | 九色91av | 精品在线视频观看 | 国产精品女教师 | 免费午夜视频在线观看 | 在线黄频 | 香蕉网在线播放 | 久久久久久久av | 欧美一区二区三区免费看 | av在线电影网站 | 欧美巨乳网 | 最近在线中文字幕 | 日韩在线精品视频 | 天天射天天爱天天干 | 91九色视频在线观看 | 国产一级在线免费观看 | 国产精品久久久久久久电影 | 奇米影视四色8888 | 免费久久久 | 天天操操操操操 | 亚洲成人资源网 | 欧美一级免费 | 国产精成人品免费观看 | 精品视频一区在线 | 九草在线观看 | 亚洲精品网站在线 | 日韩毛片在线免费观看 | 96精品视频 | 久久久久久久av | 五月婷婷色综合 | 日韩a级免费视频 | 日韩欧美精品在线 | 免费观看成人网 | 国产免费av一区二区三区 | 久久综合免费视频 | 亚洲欧美日韩国产一区二区 | 日韩在线观看一区 | 中文字幕亚洲综合久久五月天色无吗'' | 夜夜操天天干 | 91在线区 | 激情综合色图 | 99在线视频免费观看 | 丰满少妇一级片 | 麻豆久久久久久久 | 日韩欧美xx | 中文字幕精品一区二区精品 | 精品久久久久久亚洲综合网站 | 国产日韩欧美在线播放 | 成人国产网站 | 成人免费观看视频网站 | 日本精品视频网站 | 91精品在线免费观看 | 久久曰视频 | 黄色成人在线网站 | 久久综合国产伦精品免费 | 亚洲精品视频在线看 | 久久视频一区二区 | 日韩在线观看精品 | 国产日韩欧美综合在线 | 亚洲欧美日韩国产一区二区 | 午夜电影一区 | 国产精品午夜免费福利视频 | 亚洲精品在线看 | 亚洲国产成人精品在线观看 | 99精品免费久久久久久日本 | 成人av网址大全 | 日韩一二区在线观看 | 五月婷亚洲 | 亚洲 欧美 综合 在线 精品 | 国产精品毛片久久久久久久久久99999999 | 免费在线观看视频a | 99热这里只有精品在线观看 | 人人讲下载 | 久久久久免费电影 | 久久亚洲区 | 成人毛片一区 | 欧美在线视频a | 成人影音av | 久久久亚洲麻豆日韩精品一区三区 | 国产午夜精品一区二区三区在线观看 | 日韩在线观| 黄色福利网站 | 久久免费av电影 | 亚洲精品视频在线观看免费视频 | 亚洲日本韩国一区二区 | 日日日操操| 日韩视频免费 | 在线观看黄 | 国产视频精品免费播放 | 亚洲日b视频 | 正在播放五月婷婷狠狠干 | 最新在线你懂的 | 人人澡人人爽欧一区 | 色婷婷狠狠五月综合天色拍 | www免费 | 黄色毛片一级片 | 欧美日韩视频在线观看免费 | 99国产视频 | 亚洲最新视频在线播放 | 久久人人添人人爽添人人88v | 免费精品视频 | 欧美精品xxx | 国产一区高清在线 | 伊人天天综合 | 欧美福利片在线观看 | 91插插插免费视频 | 91视视频在线直接观看在线看网页在线看 | 国产精品嫩草影视久久久 | 五月婷在线 | 中文字幕精| 久久久久综合视频 | 色综合婷婷 | 特级毛片网 | 国外av在线| 91在线91拍拍在线91 | 国产午夜免费视频 | 欧美a级免费视频 | 免费日韩在线 | 欧美国产亚洲精品久久久8v | 亚洲网站在线 | 蜜臀av夜夜澡人人爽人人 | 久久涩涩网站 | 日本韩国欧美在线观看 | 97碰碰精品嫩模在线播放 | 国产一区二区播放 | 99精品视频在线 | 欧美色噜噜| 激情综合色综合久久 | 天海翼一区二区三区免费 | 激情五月婷婷丁香 | 久久国产精品久久国产精品 | 亚洲专区在线播放 | 一区二区中文字幕在线播放 | 国产午夜剧场 | 久草精品视频在线看网站免费 | 香蕉视频久久 | 激情六月婷婷久久 | 久久精品99国产国产 | 伊人色综合久久天天网 | 欧美视频www| 成人福利av | 狠狠色丁香久久婷婷综合丁香 | 在线综合 亚洲 欧美在线视频 | 精品在线不卡 | 开心色婷婷 | 国产一区二区中文字幕 | 精品亚洲国产视频 | 国产精品成人免费一区久久羞羞 | 免费高清看电视网站 | 日韩在线观看一区二区三区 | 国产精品岛国久久久久久久久红粉 | 国产精品久久久久9999吃药 | 看片的网址 | 免费a视频在线观看 | 九九九九精品九九九九 | 日韩一区视频在线 | 天天综合入口 | 色在线国产 | 成人91免费视频 | 激情网在线观看 | 日本成人中文字幕在线观看 | 一区二区三区www | 丁香资源影视免费观看 | 国产精品久久久久久999 | a视频在线 | 欧美在线视频一区二区三区 | 四虎天堂| 日本中文字幕在线一区 | 国产成人一区在线 | 婷婷射五月 | 97av色 | 最近乱久中文字幕 | 国产aa精品 | 视频在线播放国产 | 色999五月色 | 国产一级免费观看 | 伊人色播 | 91精品国自产在线偷拍蜜桃 | 日本在线观看一区二区 | 婷婷综合导航 | 天天操天天弄 | 日日成人网| 国产精品一区在线观看你懂的 | 欧美一级片免费在线观看 | 日韩理论片 | 中文字幕在线观看免费高清完整版 | 国内99视频 | 91色欧美 | a'aaa级片在线观看 | 午夜美女视频 | 日韩欧美一区二区三区在线观看 | 国产精品久久久久久久久久久杏吧 | 久久午夜羞羞影院 | 天天干天天插伊人网 | 欧美精品三级 | 国产综合在线观看视频 | 91中文字幕在线 | 欧美色综合天天久久综合精品 | 三级午夜片 | 免费看片黄色 | 成人av资源网 | 人人爱人人添 | 久久官网 | 操操操av | 日韩久久久久久久久久久久 | 在线观看成人毛片 | 久久午夜精品影院一区 | 亚洲精品在线免费 | 婷婷久久一区 | 91麻豆文化传媒在线观看 | 九色porny真实丨国产18 | 免费黄色在线网址 | 中国一级片免费看 | 亚洲少妇xxxx| 成人在线视频一区 | 成人啊 v | 欧美一级在线 | 亚洲国产精品人久久电影 | 免费v片 | 国产精品福利久久久 | 91av原创 | www.777奇米| 在线观看久久久久久 | av福利在线导航 | 国产精品99久久久久久久久 | 中文字幕在线观看免费高清完整版 | 午夜国产一区 | 国产亚洲高清视频 | 婷婷伊人综合亚洲综合网 | 极品久久久久 | 国产精品九九久久久久久久 | 免费观看黄色12片一级视频 | 色综合久久88色综合天天免费 | 日日爽天天爽 | 婷婷综合av | 久久男人视频 | 国产一区二区成人 | 亚洲综合成人婷婷小说 | 深夜成人av| 国产69精品久久久久99尤 | 97av在线视频 | 国产黄色精品在线 | 日韩在线网址 | 国产剧情一区 | 免费91麻豆精品国产自产在线观看 | 日韩另类在线 | 黄色三几片 | 亚洲国产精品一区二区久久,亚洲午夜 | 麻豆91视频 | 一级欧美日韩 | 91久久偷偷做嫩草影院 | 91福利在线观看 | 久久久久婷 | 国产精品麻豆三级一区视频 | 日韩欧美99 | 久久99国产精品免费网站 | 麻花传媒mv免费观看 | 成人av免费在线 | 国产电影一区二区三区四区 | 在线观看一区 | 欧美日韩精品国产 | 婷婷激情小说网 | 永久免费的啪啪网站免费观看浪潮 | 亚洲精品午夜久久久久久久 | 天天天天爽| 日韩一级理论片 | 日日摸日日添夜夜爽97 | 曰本三级在线 | 狠狠狠狠狠狠狠 | 97在线资源 | 99精品视频在线免费观看 | 91香蕉国产在线观看软件 | 色久综合 | 久久久久免费电影 | 日韩高清一区 | 中文字幕无吗 | 久草在线视频免费资源观看 | 超碰电影在线观看 | 91毛片视频 | 婷婷色视频 | 四虎在线永久免费观看 | 91成人亚洲| 国产精品女视频 | 麻豆va一区二区三区久久浪 | 免费视频91 | 在线黄网站| 中文字幕在线观看91 | 中文字幕视频网 | 国产精品破处视频 | 亚洲一区二区三区在线看 | 午夜视频欧美 | 天天干天天操天天 | 香蕉久久国产 | 久操伊人 | 色婷婷狠狠操 | 久草在线免费资源站 | 最近中文字幕视频完整版 | 国产黄色大片免费看 | 免费一级特黄毛大片 | 国产裸体视频bbbbb | 伊人中文在线 | 成人四虎| 日韩在线观看免费 | 久久久高清免费视频 | 成 人 免费 黄 色 视频 | 在线免费观看视频a | www.色爱 | 亚洲一级片在线观看 | 亚洲国产精品影院 | 九九久久免费视频 | 97福利在线| 99久久精品视频免费 | 不卡在线一区 | 色中文字幕在线观看 | 免费a现在观看 | 国产欧美最新羞羞视频在线观看 | 中文字幕a∨在线乱码免费看 | 欧美精品做受xxx性少妇 | 中文字幕在线一区二区三区 | 色香蕉网| 久久99热这里只有精品国产 | 久草在线中文视频 | 黄色国产精品 | 成人动漫视频在线 | 欧美精品黑人性xxxx | 高清av在线| 欧美精品乱码久久久久久 | 亚洲视频在线视频 | 97在线观看免费高清 | 日韩av不卡播放 | 特级黄色一级 | 欧美激情第八页 | 中文字幕中文字幕在线一区 | 国产高清视频免费观看 | 狠狠狠狠狠狠狠 | 亚洲视频456| 麻豆一精品传二传媒短视频 | 精品日韩视频 | 成人九九视频 | 香蕉网在线 | 日韩在线观看 | 天天综合久久综合 | 天天操夜操视频 | av在线成人 | 久久中文字幕导航 | 婷婷国产v亚洲v欧美久久 | 国产精品美女网站 | 最近中文字幕免费视频 | 欧美精品免费视频 | 婷婷丁香五| 中文字幕亚洲欧美日韩 | 黄色小说18| 伊人久久影视 | 91精品91| 亚洲精品麻豆 | 狠狠色狠狠色综合系列 | 欧美-第1页-屁屁影院 | 亚洲国产免费看 | 欧美日韩一区二区三区在线观看视频 | 色偷偷97 | 欧美精品一区二区性色 | 精品久久五月天 | 手机成人在线电影 | 亚洲影视资源 | 精品一区在线 | 国产精品美女毛片真酒店 | 黄色免费网站大全 | 黄色小网站在线观看 | 天天综合视频在线观看 | 中文不卡视频在线 | 天天天天天天天操 | 国产精品成人av电影 | 在线视频18在线视频4k | 在线观看av的网站 | 美州a亚洲一视本频v色道 | 国产精品xxxx18a99 | 国产精品69av| 久久99国产精品视频 | 成人午夜网 | 一级片免费观看视频 | 干干夜夜 | 欧美日韩xxx | 中文字幕在线看人 | 欧美精品中文字幕亚洲专区 | 97精产国品一二三产区在线 | 国产精品毛片一区二区 | 国产99一区视频免费 | 超碰精品在线 | 国产精品视频全国免费观看 | 不卡av电影在线观看 | 五月婷婷一区二区三区 | 成年人视频在线免费 | 日韩久久网站 | 国产精品美女久久久 | www.天天色.com| 香蕉精品视频在线观看 | 狠狠操天天射 | 久久成年人网站 | 亚洲精品综合在线观看 | 国产裸体视频网站 | 国产午夜精品一区二区三区 | 九九热免费精品视频 | 国产高清免费av | 久久精品人人做人人综合老师 | 人人爽人人爽人人片av免 | 免费看片网站91 | 久久久国产影院 | 2021av在线 | 欧美精品视| 久久成人午夜视频 | 久久日本视频 | 国产在线观看免费av | 精品国产人成亚洲区 | 日本在线观看中文字幕无线观看 | 婷婷干五月 | 96亚洲精品久久 | 狠狠干婷婷 | 黄色毛片观看 | 日韩免费三级 | 在线观看av黄色 | 日日夜夜婷婷 | 亚洲精品激情 | 99久久婷婷国产一区二区三区 | 婷婷深爱激情 | 91精彩视频在线观看 | 日韩三级中文字幕 | 国产毛片久久 | 天天操天天干天天综合网 | 视色网站| 91丨九色丨蝌蚪丨对白 | 国产精品理论片在线播放 | 在线观看精品一区 | 色综合天天综合网国产成人网 | 国产又粗又硬又爽的视频 | 超碰在线免费福利 | 国产视频在线观看一区二区 | 色婷婷亚洲婷婷 | 91亚洲精| 青青网视频 | 黄色毛片在线 | 香蕉91视频| 久久久久久久久电影 | 国产99一区二区 | 国产最新91 | 国产一区福利在线 | 欧美日韩国产网站 | 成人动漫一区二区 | 国产一级电影 | 亚洲三级黄色 | 欧美激情综合色综合啪啪五月 | 欧美日韩一级在线 | 中文字幕 在线看 | 成人黄色小视频 | 91成人在线免费观看 | 日韩国产精品一区 | 99久久这里只有精品 | 日韩精品欧美视频 | 久日精品 | 97人人超碰在线 | 欧美精品日韩 | 免费日韩电影 | 最近日本韩国中文字幕 | 国产精品免费久久久 | 中文字幕 二区 | 免费黄色看片 | 欧美aⅴ在线观看 | 亚洲性视频 | 激情视频在线观看网址 | 午夜体验区 | 最近免费观看的电影完整版 | 91高清免费 | 久久久久国产一区二区三区四区 | 91禁在线看 | 久草免费新视频 | 久草在线视频网站 | 黄色三级免费看 | 在线亚洲欧美日韩 | 黄色成人影视 | 99久久综合狠狠综合久久 | 精品久久网 | 中文在线免费视频 | 91爱看片| 亚州欧美视频 | 五月婷婷深开心 | 在线看片成人 | 91热视频在线观看 | 手机看片久久 | 又爽又黄又无遮挡网站动态图 | 午夜精品一区二区三区在线观看 | 美女视频黄的免费的 | 国产精品美女毛片真酒店 | 日韩最新在线视频 | 四虎影视av| 精品亚洲va在线va天堂资源站 | 丝袜美腿在线 | 一区二区三区动漫 | 在线看的毛片 | 天天射天天爽 | 久久精品999 | 在线观看视频91 | 六月天色婷婷 | 亚洲一区二区三区在线看 | 中文字幕免费高清在线 | 天天色中文 | 天天天天爱天天躁 | 午夜精品久久久久久久99热影院 | 国产69久久 | 九九在线播放 | 久久永久免费视频 | 99精品热视频只有精品10 | 中文字幕在线国产 | 欧美色图p| 在线观看精品一区 | 免费看一级黄色 | 亚洲一区二区精品视频 | 国产成人精品一区二区三区免费 | 天天色天天射天天综合网 | 精品一区二区三区电影 | 99热这里精品 | 国内精品久久久久影院优 | 国产白浆视频 | 久久成 | 成人久久网 | 亚洲国产精品久久久久婷婷884 | 激情视频免费在线 | 久久亚洲欧美日韩精品专区 | 色爱区综合激月婷婷 | 黄色一级大片免费看 | 国产精品黄色 | 久久久久国产精品视频 | av黄色一级片 | 亚洲一区二区精品3399 | 2021久久| 久久精彩免费视频 | 欧美久久久久久久久中文字幕 | 亚洲精品国产成人av在线 | 在线亚洲精品 | 欧美专区国产专区 | 免费久久99精品国产 | 久久在线免费视频 | 一级黄色片在线免费看 | 久久69精品久久久久久久电影好 | 91成人黄色| 新版资源中文在线观看 | 天天干天天干 | 亚洲高清国产视频 | 欧洲av不卡 | 国产五月色婷婷六月丁香视频 | 国产精品女同一区二区三区久久夜 | 久久任你操 | 国产亚洲在线视频 | 五月综合色婷婷 | 狠狠狠的干 | 丁香婷婷色综合亚洲电影 | 久久在线观看视频 | 特级毛片在线观看 | 夜夜操夜夜干 | 日韩在线免费看 | 又大又硬又黄又爽视频在线观看 | 国产黄色片免费在线观看 | 久久久电影网站 | 日本在线精品视频 | 伊人伊成久久人综合网小说 | 黄色成年片 | 日韩三级av| 久久综合色播五月 | 一级成人免费视频 | 日韩在线短视频 | 久久欧美精品 | 欧美性生活大片 | 免费看片日韩 | 亚洲女人天堂成人av在线 | 国产欧美在线一区二区三区 | 日韩在线网址 | 成全在线视频免费观看 | 亚洲国产成人精品在线观看 | 亚洲国产网址 | 天堂av网址| 国产亚洲欧洲 | 国产精品一区二区中文字幕 | 狠狠狠狠狠色综合 | 超碰在线资源 | 国产高清视频在线播放 | 国产字幕在线播放 | 日韩欧美第二页 | 三级av网站 | 91正在播放| 国产高清视频在线免费观看 | 亚洲成人av片 | 久精品一区| 国产亚洲欧美在线视频 | japanesexxx乱女另类 | 亚洲精品小视频在线观看 | 蜜臀av.com | 国产精品一区二区三区在线 | www.久久久| 91精品啪在线观看国产线免费 | 久久美女精品 | 成年人毛片在线观看 | 久久久精品欧美一区二区免费 | 香蕉免费 | 韩日成人av| 国偷自产中文字幕亚洲手机在线 | 日韩字幕在线 | 中文字幕在线观看一区二区三区 | 天堂视频一区 | 久久久久久免费 | 一区二区不卡视频在线观看 | 国产小视频免费观看 | 日韩三级在线观看 | 看污网站| 日韩精品欧美精品 | 在线观看www91| 免费观看一级一片 | 精品免费久久久久久 | 黄色www免费 | 国产精品福利在线播放 | 国产精品一区二区av影院萌芽 | 欧美日韩一区二区免费在线观看 | 色资源在线观看 | 操碰av | 久热av | 米奇四色影视 | 欧美另类高潮 | 国产精品久久久久久久午夜片 | 日韩www在线 | 99精品视频免费看 | 亚洲精品18日本一区app | 69久久99精品久久久久婷婷 | 久久久精品二区 | 99久久精品久久久久久动态片 | 天天干天天插 | 欧美一区免费观看 | 五月天综合色 | 中国成人一区 | 片网址| 国产亚州av | 色橹橹欧美在线观看视频高清 | av高清影院 | 久久综合五月婷婷 | 免费在线激情电影 | 国内精品亚洲 | 97av影院 | 精品久久久久久亚洲综合网站 | 国产精品高潮呻吟久久av无 | 婷婷丁香色综合狠狠色 | 91av在| 在线观看黄色大片 | 高清色免费 | 伊人五月天 | 久草在线视频国产 | 伊人五月在线 | 午夜色影院 | 在线黄色国产电影 | 日韩欧美在线一区 | 韩国av免费在线观看 | 日韩色av色资源 | 日韩精品视频第一页 | 精品免费久久久久久 | 国产青草视频在线观看 | 久久久久久久久久久高潮一区二区 | 婷婷开心久久网 | 99热精品国产一区二区在线观看 | 欧美成人xxxxxxxx| а天堂中文最新一区二区三区 | 日韩高清在线一区二区三区 | 精品国产免费av | 久爱精品在线 | 亚洲欧美国产精品18p | 久久精品一区二区三区中文字幕 | 99久久精品国产观看 | 精品字幕在线 | 中文字幕第一页在线视频 | 成人午夜片av在线看 | 国产乱对白刺激视频在线观看女王 | 国产精品小视频网站 | 亚洲精品女人久久久 | 日韩欧美高清在线观看 | 99视频精品免费视频 | 99精品视频免费观看视频 | 国产乱视频 | 美女视频一区二区 | 久久在线视频精品 | 特级西西人体444是什么意思 | 成人免费看片98欧美 | 国产99久久九九精品免费 | 在线免费黄网站 | 国产精品九九视频 | 岛国av在线免费 | 亚洲黄色一级大片 | 亚洲精品美女久久久久 | 欧美精品在线一区二区 | a级国产乱理论片在线观看 特级毛片在线观看 | 美女一二三区 | 国产精品久久99综合免费观看尤物 | 久久av网 | 久久免费视频5 | 色九色 | 特黄特黄的视频 | 国产福利91精品 | 免费男女羞羞的视频网站中文字幕 | 欧美a级成人淫片免费看 | 欧美黄污视频 | a在线观看免费视频 | 国产日韩欧美在线播放 | 九九精品无码 | 99国内精品久久久久久久 | 国产亚洲综合性久久久影院 | 亚洲欧洲国产日韩精品 | 成人黄大片视频在线观看 | 91专区在线观看 | 日韩夜夜爽 | 欧美性色综合 | 国产精品永久免费观看 | 中文字幕在线观看完整版 | 日韩欧美精品在线观看 | 国产成人精品三级 | 久久国产一区二区三区 | 久久久久免费精品国产小说色大师 | 激情综合六月 | 欧美日韩国产精品一区二区亚洲 | 精品国产视频在线观看 | 久久 地址 | 中文av在线免费观看 | 91av超碰| 91九色精品女同系列 | 色婷婷激情电影 | 天天射成人 | 国产成人精品女人久久久 | 久久 国产一区 | 久久久久国 | 日韩系列在线观看 | 亚洲精品在线观看网站 | 中文字幕永久 | 亚洲精品成人av在线 | 国产精品久久一区二区无卡 | 探花视频免费观看高清视频 | 色综合久久88色综合天天人守婷 | 欧美日本三级 | 久久国产一区二区三区 | 99国产精品一区二区 | 麻豆精品视频在线观看免费 | 午夜av影院 | 99在线精品视频 | av免费观看网站 | 91免费观看 | 99精品系列| 精品国产亚洲一区二区麻豆 | 九九精品视频在线观看 | 国产精品久久久av久久久 | 亚洲一级片在线看 | 久久精品99国产国产 | 成年人免费电影 | 久久国内精品99久久6app | 中文字幕在线看视频国产中文版 | 欧美日韩国产成人 | 亚洲天天综合网 | 日本公妇在线观看 | 成人免费视频在线观看 | 久久综合婷婷综合 | 国产免费成人 | 久久毛片网站 | 国产精品久久久久久久久久久免费看 | 波多野结衣视频一区 | av中文字幕在线看 | 色婷婷久久久综合中文字幕 | 五月婷婷在线观看视频 | 国产va精品免费观看 | 日韩啪视频 | 黄色电影在线免费观看 | 国产999视频 | 欧美精品v国产精品v日韩精品 | 国产小视频免费在线网址 | 国产高清视频在线观看 | 欧美日本在线观看视频 | 黄色成人av在线 | 久久久久这里只有精品 | 在线免费试看 | 天天爽天天爽夜夜爽 | 麻豆国产在线视频 | 超碰在线天天 | 国产免费一区二区三区最新 | 人人干人人爽 | 黄色一及电影 | 成人黄大片 |