999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

程序靜態分析報告處理方法綜述

2023-02-06 07:48:52龔士豪
計算機技術與發展 2023年1期
關鍵詞:排序程序報告

黃 松,龔士豪

(陸軍工程大學 指揮控制工程學院,江蘇 南京 210007)

0 引 言

隨著信息化程度的不斷提高,軟件的復雜性也在不斷增加,這對提高軟件質量、保證其行為的可信性帶來了一定的困難。許多軟件產品在發布甚至廣泛應用后,往往仍包含各種各樣的缺陷和漏洞,這不僅降低了用戶體驗,同時也使得軟件面臨安全風險。靜態分析在尋找代碼缺陷和漏洞方面具有舉足輕重的作用,已成為軟件質量保證實踐中不可或缺的一部分[1]。靜態分析工具的應用可以在一定程度上提高軟件質量, 但分析報告中的大量誤報以及人工檢查報告所需的花費會降低靜態分析工具的可用性,于是各種報告處理方法不斷涌現。該文將靜態程序分析報告處理方法定義為“對靜態程序分析工具輸出的報告進行處理,以達到降低工具誤報率和漏報率目的的一系列方法”。通過對報告進行后續處理,上述問題能夠得到緩解,分析工具的可用性得以提高。迄今為止,機器學習、統計分析、數據融合等技術已被應用于報告處理領域之中。

通過調研國內外近些年在程序靜態分析報告處理方法方面的研究進展,簡要綜述程序靜態分析報告處理方法的研究動向,同時根據調研內容,討論程序靜態分析報告處理方法未來可能的研究方向。

1 靜態分析及其報告處理

程序分析技術以分析過程“是否需要運行軟件”為準則,可以劃分為靜態分析技術和動態分析技術兩大類。動態分析通過運行程序獲取程序的輸出或者內部狀態等信息來驗證程序是否存在缺陷和漏洞,針對特定的輸入,通常可以取得精度較高的分析結果,但對于其他輸入則無法保證[2]。靜態分析無需運行程序,通過語法分析、定理證明、符號執行等技術來發現程序中存在的缺陷。與動態分析相比,靜態分析在編碼階段就可以實施,能更早地發現問題,并且對程序執行路徑分析的更全面,可以發現更多缺陷。

目前流行的靜態分析工具,例如Coverity、Klocwork、Fortify、Parasoft等,大多采取多種分析技術相結合的分析策略,旨在發現更多的缺陷和漏洞。但根據Rice定理:不存在可以判定任何程序是否具有某種非平凡屬性的通用算法[3]。例如程序路徑的可行性就是不可判定的,因此無法要求靜態分析工具對程序進行精確的分析,只能采用流不敏感或上下文不敏感等分析策略給出保守的結果,這將不可避免地導致誤報和漏報的產生[4]。誤報即分析工具報告程序某處存在缺陷,但實際上此缺陷并不存在。漏報即程序某處實際存在缺陷,而分析工具沒有報告。靜態分析工具的分析性能大多使用漏報率和誤報率來衡量。

研究人員發現,靜態分析工具的誤報率通常高達30%~100%,每千行代碼就會產生40個警報[5]。據估計,確認一個警報的正確性大約需要5.28分鐘,假設一個工具報告了500個警報,那么需要測試人員每天工作8小時,連續5.5天才能將這份報告全部檢查完[6]。這種體驗往往會讓測試人員拒絕再使用這些工具。

對此,多年來,人們在靜態程序分析報告處理方面做了大量的研究工作,取得了很大的進步。通過提高靜態分析工具的分析精度或對報告進行有效地后續處理可以在一定程度上解決上述問題[7]。對于提高分析精度這一方法,許多學者進行了研究[8-10],但由于驗證問題通常是不可判定的,并且分析工具在設計時也必須在精度與速度之間做出取舍,因此報告中存在誤報是無法避免的。針對第二種方法——對報告進行有效地后續處理,國內外的學者也提出了許多方案,根據處理方法的基本思想可分為:基于多工具報告融合的處理技術、基于警報分類的處理技術,以及基于警報排序的處理技術。這些方法通常是互補的,可以獨立工作,也可以通過不同的方式組合在一起。

2 基于多工具報告融合

雖然市面上存在大量靜態分析工具,但由于不同靜態分析工具的工作原理與運行機制大不相同,單一工具通常只在小部分問題上表現的很好。例如,對于詞法工具來說,當漏洞規則庫不同、漏洞定義的等級不同時,分析結果會出現很大差異[4]。因此,在檢查源代碼時,為了盡可能發現其中的缺陷,不能僅使用單一的工具,但每個工具在生成分析報告時遵循的風格不同,工具之間的缺陷檢測能力的優勢很難結合起來。若能將不同分析工具的分析結果通過某種方式融合在一起,則可以充分利用分析工具各自的優勢,讓報告間相互補充,相互驗證,降低報告的漏報率與誤報率,有效提高工具的效率和性能。使用戶輕松地從多個靜態分析工具中受益,從而提升軟件質量。

Kong等人[11]提出了一種基于數據融合的源代碼靜態分析漏洞檢測技術。他們首先將來自不同分析工具的分析報告中的漏洞信息提取出來,以一個六元組序列的形式存儲。六元組包括漏洞的文件名、漏洞所在行數、危險等級、漏洞類型、導致漏洞的函數和漏洞威脅評分。通過這種統一的格式,多份報告可以融合為一份報告。此外,融合過程中每條漏洞被賦予一個估分隨機變量X代表該漏洞為真實漏洞的概率。其值的定義準則為:

(1)多個工具同時識別的漏洞分值高;

(2)漏洞本身危險等級高則分值高;

(3)來自不同分析工具的結果以工具自身的可信賴度權值體現對分值的貢獻。

工具的可信賴度權值可以由用戶指定,也可以由誤報率和漏報率自動評估。融合以后,漏洞按照估分由高到低排列。該方法經過融合多個工具的報告并對最終報告中的警報進行排序,增加了檢測出的漏洞數,繼而降低了漏報率,并且最可能是真正漏洞的漏洞被放在前列,用戶可以以較少的時間找出更多的漏洞。但此方法并未考慮不同工具的報告之間存在重復警報的問題,融合報告中的冗余警報仍需處理。

Dang[12]提出了一個混合模型,將數據融合與統計分析相結合,對不同工具生成的報告中的警報進行融合并排序。與Kong等人[11]的方法類似,在數據融合時,提取不同工具所產生的警報間共有的屬性,將警報融合為統一格式。例如Cppcheck和SciTool,它們的警報共有屬性是文件名、警報類別和行號,而PMD和FindBugs則是文件名、優先級、行號和規則集。與Kong等人[11]不同的是,Dang并不為單個警報排序,他認為工具生成的警報都與文件或類相關,因此可以對文件或類排序。從融合后的警報中挖掘出統計特征之后,對這些特征使用主成分分析法(PCA),從而為文件或類計算得分并排序。該方法可以很好地將具有大量真實缺陷的文件放在警報列表頂部,將具有誤報的文件放在列表底部,但并不會去除誤報也不會檢測正報。

Meng等人[13]通過為缺陷定義缺陷模式,并提供一個通用規范使它們保持一致的描述風格,從而融合來自不同工具的分析報告。每個通用規范包含三個部分:摘要信息、所屬缺陷模式類別和缺陷嚴重等級。當不同工具產生的結果被轉換為一致的描述風格后,再應用優先級策略對其進行排序。優先級策略包括:

(1)根據警報嚴重等級。例如,屬于“錯誤”的警報要排在“不良風格”前面;

(2)同一類中被多次報告的缺陷擁有更高的優先級。

經過上述操作,來源于不同工具但屬于同一缺陷模式的警報被放到一起,并且危害等級高的警報位于報告前列。用戶可以選擇感興趣的缺陷模式重點關注,將注意力放在更重要的缺陷上。但此方法僅適用于文中使用的三個Java靜態分析工具,如果出現不屬于任何缺陷模式的警報則無法對其進行處理。此外,雖然來源于不同工具但屬于同一缺陷模式的警報被放到一起,但警報冗余問題依舊存在,并且也沒有分析警報的正確性。

張麗等人[14]為了解決在分析報告簡單融合時,融合報告中引入了每一種工具的誤報的問題,重點研究了如何優化融合后分析報告的質量。她們利用缺陷數據的一些自然屬性,例如報告該缺陷的工具、缺陷所在代碼位置、缺陷所在代碼的復雜程度等,通過機器學習算法對警報進行二元分類(正報和誤報),從而剔除部分警報,實現集成優化。能夠實現分類的機器學習算法很多,她們選用了樸素貝葉斯、邏輯回歸、決策樹和支持向量機。優化過程包括報告生成與解析、數據預處理、分類優化三個部分。其中的數據預處理部分又包括了數據清洗、標準化、函數粒度級別的聚合、向量化以及數據分割的過程,以將數據處理成機器學習算法所需的形式。經過在Juliet數據集上的大量實驗可證實,優化后的分析報告在各項指標上均優于優化前,其中支持向量機和決策樹獲得了較好的分類效果。

3 基于警報分類

基于警報分類的處理技術是根據警報之間的某些關系或代碼特征對警報進行分類的技術。在這類方法中,機器學習技術被大量使用以構建分類器,例如k-最近鄰(K-Nearest Neighbor)[15]、隨機森林(Random Forest)[16]、支持向量機(Support Vector Machines)[17]、邏輯回歸模型[18]等。在基于警報之間關系的分類技術中,通常一組警報中的某一個警報處于主導地位,其正確性被驗證后,同組中的其他警報就無需再檢查。基于代碼特征的分類方式則直接將警報分為正報和誤報,測試人員只需檢查正報。兩種方法都大大降低了警報審查的工作量,但錯誤的分類會導致部分正報被忽視,也就造成真實缺陷仍然遺留在程序中,因此對于安全關鍵型軟件來說,該方法并不安全。

Ruthruff等人[18]使用邏輯回歸模型,基于警報和其所涉及代碼中的信息來預測警報是否為誤報或可操作警報。值得關注的是,他們在構建模型過程中使用了一種篩選方法,該方法會丟棄預測能力較低的指標,節省了預測成本。在谷歌進行的一項案例研究表明,該模型在預測誤報方面的準確率超過85%,在識別可操作警報方面的準確性超過70%。

張大林等人[19]提出基于缺陷關聯的報告處理技術。他們根據不同缺陷間的依賴關系將缺陷分組,當缺陷a可靠地依賴于缺陷b,那么如果缺陷b被確定為誤報,則缺陷a也是誤報,缺陷b就被稱為主導缺陷。缺陷間的依賴關系通過切除一個缺陷的錯誤狀態來確定,如果一個缺陷的錯誤狀態被切除后會影響另一個缺陷的警報生成,則依賴關系存在。而警報是否為誤報是根據缺陷的錯誤狀態是否可達來判斷的,錯誤狀態不可達則代表警報為誤報。該方法可以有效減少警報的確認工作,為大規模軟件使用靜態分析工具提供了有力支持。但如何在靜態分析工具所提供的抽象域下精確地切除缺陷錯誤狀態仍需改進。Lee等人[20]提出的警報聚類方法與張大林[19]的方法類似,通過尋找主導警報減少檢查警報的負擔。在14個開源基準測試中,他們的聚類方法可以識別出45%的警報是非主導的,相當于減少了45%的警報檢查的工作量。

Reynolds等人[21]通過研究不同類型的誤報信息,總結出14個核心的誤報模式,實現了自動判斷一條警報是否為誤報。在研究過程中,由于判斷一條警報是否為誤報并不容易,因此他們選擇了Juliet測試套件作為數據集,因為在這個測試套件中漏洞所在位置已經添加了注釋來指示。當發現一條誤報時,他們會對產生這條誤報的源代碼進行刪減,直到刪除下一個元素會導致誤報消失。通過這種方式,可以去掉源代碼中與誤報無關的所有元素,剩下的代碼即為誤報模式。然后為這些模式分類就可以確定代碼庫中反復出現的源代碼結構,正是這些結構會導致靜態分析工具產生誤報。這項工作減少了開發人員和測試人員需要驗證的警報數量,但同時也具有一些局限性。首先,Juliet測試套件是人造數據集,不能代表實際代碼。其次,缺乏對誤報模式的規范描述,這種描述應該是獨立于語言的。最后,數據不完整,研究中缺乏誤報模式的出現頻率。

在進一步研究中,Koc等人[22]在預處理階段引入了兩種技術來縮減代碼,分別是方法體和程序切片。方法體是一種較為簡單的方法,僅僅是將包含錯誤行的方法的主體部分保留下來。但需要注意的是,與警報相關的許多代碼位置并不在警報方法的主體中,很多情況下警報的原因跨越了多個方法和類,因此這種縮減并不完美。程序切片是在程序中給定一個位置,將程序縮減到最小形式,但在該位置仍保持相同行為的技術。在訓練模型階段,同樣使用了兩種技術,分別是基于貝葉斯推理的學習模型和基于神經網絡的長短期記憶網絡(LSTM)。在國際通用數據集OWASP benchmark上的實驗表明,樸素貝葉斯模型在方法體和程序切片方法下的分類準確率分別為63%和72%,LSTM則分別為89.6%和85%,均取得了不錯的分類結果。但該實驗僅針對OWASP benchmark下的SQL注入缺陷,數據集和缺陷類型都比較片面。

Flynn等人[16]分別使用了Lasso回歸模型、分類回歸樹(CART)、 隨機森林(Random Forest)和極端梯度提升(Extreme Gradient Boosting)四種分類技術,基于28個特征訓練分類器。并且使用多個靜態分析工具,1個開源數據集和3個來自合作者的匿名數據集生成報告。測試結果表明,使用多個靜態分析工具可以有效提高分類的準確性,但許多類型的缺陷標記的不夠充分,導致對這些缺陷的預測準確性較差。

Heckman[23]使用51個候選特征,15種機器學習算法建立模型對警報分類,獲得了88%~97%的平均正確率。構建模型分為四個步驟:

(1)收集靜態分析產生的警報的特征。

(2)使用屬性評估算法來選擇重要的警報特征集合。

(3)使用選定的特征集合和機器學習建立模型。

(4)通過指標評估選擇出最佳模型。

他們發現,不同項目之間選用的警報特征和最佳模型是不同的。也就是說,當面對不同的項目時,需要重新選擇警報特征并訓練模型才能取得較好的分類效果,這在工程實踐中顯然是不可取的,如何使分類模型更加通用是值得考慮的問題。

4 基于警報排序

基于警報排序的處理技術一般通過計算每一條警報是正報的概率來為警報排序,將最有可能揭示真實錯誤的警報放到報告頂端,而具有較低正報可能性的警報被放到報告底部。排序有助于測試人員在給定時間內發現更多的缺陷,提高工作效率。

當前有許多不同類型的排序算法,它們僅針對特定的程序語言,并非通用。排序算法的實現方法主要分兩類:第一類是通過分析報告中的每一條警報,尋找錯誤警報之間的關系和它們之間的相同點,找出錯誤警報的分布規律,從而計算得出更高效的報告排序;第二類是通過統計的方法,首先經過統計學的分析,使用貝葉斯網絡構造模型,再利用模型建立測試集與訓練集,從而預測每條警報為正報還是誤報。但是一般來說,所有的警報都需要被檢查,由于警報只是被排序而沒有過濾,因此這種方法也被認為是一種安全的方法。

Kremenek和Engler[5]提出一種基于統計分析對警報進行排序的技術——Z-Ranking。他們認為,在通常情況下,源代碼中的缺陷密度很低,因此在針對某個問題檢查源代碼時,未觸發該檢查的位置應該較多,而觸發該檢查的位置相對較少。相反,如果檢查導致很多位置觸發檢查,則這些觸發很可能是誤報。實驗表明,在報告的前10%條警報中,Z-Ranking能夠比隨機排序算法發現平均多3~7倍的錯誤。Jung等人[24]使用另外一種統計方法——貝葉斯統計,來計算警報為正報的概率,然后根據這些概率對警報進行排序,支持用戶設置概率閾值,只有超過閾值的警報才會報告給用戶。Xypolytos等人[25]提出了一個基于工具性能統計數據的排序框架。該框架的前提是要完成一個基準測試,在基準測試中,使用精確度和召回率衡量靜態分析工具針對不同類型的軟件缺陷的分析性能,然后用置信度得分來表示并據此對警報進行組合和排序。初步實驗結果表明,該方法在提高工具效率和有用性方面具有一定潛力,但基準測試對排序結果的影響較大,基準測試數據集的選擇直接影響工具的置信度得分,從而導致最終報告中警報排序結果并不準確。

Kremenek等人[26]在進一步的研究中,將警報之間的相關性用于警報排序。經過分析來自兩個大型系統(Linux和某商業系統)的歷史漏洞數據中的聚類行為,他們發現漏洞和誤報通常按代碼位置聚集,這種聚集可以發生在函數、類等級別,因此利用聚類可以大幅提高警報排序技術。并且他們將反饋機制與聚類相結合,提出了反饋排序算法。當測試人員在驗證了部分警報的正確性后,剩余的警報可以根據測試人員的反饋結果動態更新排名。此方案克服了Z-Ranking[5]不會隨檢查結果更新排名的缺點,充分利用了警報間的相關性。

Heckman[27]也將開發人員的反饋用于警報自適應排序。首先使用類型精度、代碼位置和是否產生測試失敗這三個因素來計算警報為正報的概率,并根據此概率為警報排序。其中類型精度是指基于警報類型,該警報是正報的概率,代碼位置是指基于警報在代碼中的位置,該警報是正報的概率,是否產生測試失敗是指針對某個警報測試用例是否會失敗。在當前排序的基礎上,開發人員以過濾警報的方式提供反饋,剩余的警報將根據反饋自動修改排名。Shen等人[28]在設計基于靜態分析工具FindBugs的警報排序策略時也將反饋機制納入排序過程。首先,通過統計數據,為每個缺陷模式分配預定義的缺陷可能性,并根據缺陷可能性來為缺陷報告初始化排序。然后,通過測試人員的反饋來自適應地處理初始排名,這個過程是自動執行的,基于相同的缺陷模式的錯誤報告的相關性。通過在三個廣泛使用的Java項目(AspectJ、Tomcat、Axis)上進行實驗,結果表明,該策略在精度、召回率和f1得分方面明顯優于FindBugs對警報的原始排序。

Boogerd和Moonen[29]提出使用代碼執行可能性來確定警報的優先級。對于每個警報涉及的代碼位置,計算其執行可能性。如果該位置很可能被執行,那么警報就會獲得高優先級。如果該位置不太可能被執行,則警報的優先級較低。這項技術可以使測試人員將注意力放在具有高執行可能性位置的警報上。然而,具有低執行可能性位置的警報也可能很重要,并且正是由于該位置執行概率較低,其中的嚴重錯誤更難以被檢測到。

Kim和Ernst[30-31]提出基于歷史的警報排序方法。他們通過分析軟件更改歷史,為每個警告類別計算生命周期,即警報出現與消失之間的時間。如果某類警報的生命周期較短,也就是說該類警報會很快被開發人員修復,則說明該類別中的警報很重要,在報告中應放在前列。如果一個警報長時間沒有被移除,或許說明它不值得修復,那么該類別的警報可以被忽略。在三個開源項目(Columba、Lucene、Scarab)上的實驗表明,基于歷史的警報排序算法可以將頂部警報的正報精確度分別提高17%、25%和67%,并且該排序算法是通用的,可以用于任何警報。但是如果能將分析工具對警報設置的優先級與該算法為警報設置的優先級結合起來,應該可獲得更高精度。Williams和Hollingsworth[32]也提出了一個類似的排序方案,該方案基于缺陷的修復記錄和在源代碼存儲庫中挖掘的信息。

Ribeiro等人[33]為了實現排序技術盡可能通用,將排序所需數據限制在了報告本身,而不使用其他任何信息。為了獲得良好且充足的數據,首先,將不同工具生成的警報轉換為統一格式,并且為每個警報貼上標簽,以區分它們是正報還是誤報。然后,將每個警報關聯到特定的特征,這些特征組成一個數據集用來訓練預測模型。特征中的觸發警報的工具名稱、警告的嚴重等級等可以通過一次檢查一個警報來獲取,但其他特征需要處理整個匯總的報告才能獲得,其中包括:

(1)報告中指出同一位置有缺陷的次數;

(2)給定警報位置周圍出發的警報數量;

(3)警報所指的軟件漏洞類別;

(4)其他分析工具在同一位置生成警報;

(5)為當前警報所指向的同一文件生成的警報數。

使用AdaBoost算法訓練幾個弱分類器,經過組合得到一個強分類器。在對測試數據集進行分類時,達到了0.805的準確率和0.958的召回率。

上文中三類處理方法的總結與對比如表1所示。

表1 程序靜態分析報告處理方法對比

5 靜態分析報告處理的發展方向

隨著報告處理技術的不斷探索,靜態分析在軟件測試中發揮著越來越重要的作用。雖然目前靜態分析仍面臨諸多挑戰,但相信經過研究人員更多的嘗試與努力,靜態分析會有更廣闊的應用前景。下面對靜態分析告處理領域未來的發展和研究方向提出一些展望:

(1)方法組合。雖然目前有許多報告處理方法,但不同類型的方法并非獨立,如何將它們完美的組合在一起,使靜態分析工具的優勢發揮的更充分,是未來需要考慮的問題。

(2)思路拓展。當前的處理方法大都利用警報本身或代碼中所包含的信息,沒有考慮到靜態分析工具的分析規則是否可以為警報處理做出貢獻。由于靜態分析工具基于規則庫實現缺陷的識別,并且分析報告中的警報描述與規則也有所關聯,或許未來可以利用分析規則探索一條警報處理的新道路。

(3)技術更新。當前一些熱門技術,例如機器學習,不僅被廣泛應用于程序靜態分析領域,在分析報告優化方面機器學習技術也取得了較好的效果,但仍存在警報大量重復、警報正確性難以確定和警報排序不合理等問題。或許未來可以考慮從其他技術出發,研究一種全新的報告處理方法。

6 結束語

首先,對靜態分析技術進行了簡要介紹,指出了當前靜態分析工具輸出報告存在的主要問題。接著,總結了近年來國內外研究人員提出的對靜態分析工具所產生的警報的各種處理方法,根據基本思想將其主要分為三類:基于融合、基于分類、基于排序,并分析了這三類方法的優點和缺點。最后,對靜態分析報告處理技術未來的發展方向進行了展望并對全文進行了總結,希望能為讀者在研究主題或開發方法時提供指引。

猜你喜歡
排序程序報告
排序不等式
恐怖排序
試論我國未決羈押程序的立法完善
人大建設(2019年12期)2019-05-21 02:55:44
節日排序
刻舟求劍
兒童繪本(2018年5期)2018-04-12 16:45:32
“程序猿”的生活什么樣
一圖看懂十九大報告
英國與歐盟正式啟動“離婚”程序程序
環球時報(2017-03-30)2017-03-30 06:44:45
報告
南風窗(2016年26期)2016-12-24 21:48:09
創衛暗訪程序有待改進
中國衛生(2015年3期)2015-11-19 02:53:32
主站蜘蛛池模板: 亚洲福利一区二区三区| 无码国内精品人妻少妇蜜桃视频| 国产在线观看精品| 成人一级黄色毛片| 尤物亚洲最大AV无码网站| 青青热久免费精品视频6| 亚洲无码熟妇人妻AV在线| 国产永久免费视频m3u8| 91精品最新国内在线播放| 国产你懂得| 亚洲小视频网站| 日本草草视频在线观看| 无码一区二区波多野结衣播放搜索| 国产国产人成免费视频77777| 久久精品娱乐亚洲领先| 伊伊人成亚洲综合人网7777| AV天堂资源福利在线观看| 国产精欧美一区二区三区| 久久91精品牛牛| 国产自无码视频在线观看| 国产极品美女在线观看| a毛片免费观看| 国产在线观看一区精品| 深夜福利视频一区二区| 美女被狂躁www在线观看| 欧美国产日本高清不卡| 一级毛片在线免费视频| 波多野结衣中文字幕一区二区| 丝袜亚洲综合| 国产精品一区不卡| 992tv国产人成在线观看| 国产丝袜啪啪| 手机精品视频在线观看免费| h网站在线播放| 欧美三级不卡在线观看视频| 精品人妻一区二区三区蜜桃AⅤ| 亚洲男人的天堂久久精品| 国产福利在线观看精品| 日韩欧美91| 国产一级α片| 国产精品第一区| 精品成人一区二区| 国产精品人莉莉成在线播放| 日韩免费毛片视频| 国产午夜精品一区二区三| 无码中文字幕加勒比高清| 奇米精品一区二区三区在线观看| 成人福利在线观看| 婷婷综合在线观看丁香| 亚洲另类第一页| 国产啪在线91| 国产成人永久免费视频| 天天做天天爱夜夜爽毛片毛片| 亚洲Av激情网五月天| 久久夜色精品国产嚕嚕亚洲av| 亚洲h视频在线| 在线看片免费人成视久网下载| 激情亚洲天堂| 91小视频在线播放| 亚洲an第二区国产精品| 青青草原偷拍视频| 精品欧美一区二区三区在线| 麻豆精品视频在线原创| 在线欧美a| 国产精品嫩草影院视频| 中文天堂在线视频| 亚洲精品天堂自在久久77| 欧美性久久久久| 欧美精品1区2区| 欧美成人亚洲综合精品欧美激情| 国产91精品久久| 中国成人在线视频| 欧美有码在线| 久久综合丝袜日本网| 伊人色婷婷| 色老二精品视频在线观看| 欧美激情首页| 久久综合一个色综合网| 日韩123欧美字幕| 一级毛片在线播放| h视频在线观看网站| 亚洲美女一区|