匿名代碼根本無法破解?不存在的!機器學習玩轉去匿名化
【獵雲網(微信號:ilieyun)】8月13日報道(編譯:檸萌)
編者註:匿名的代碼是否真的無法破解?代碼的開發人員是否能完美隱藏?新的研究表明可以利用機器學習技術對代碼樣本的作者進行去匿名化操作。這種操作對剽竊和隱私問題也會產生影響。本文將帶你了解去匿名化研究目前的結果和未來的方向。
文體學(語言文體的統計分析)研究者—早就知道寫作是一個獨特的、個人主義的過程。您選擇的辭彙、句法和語法都會留下痕迹。例如,只要自動化工具有足夠的培訓數據可供使用,它們現在就可以準確地識別論壇帖子的作者。但最新的研究表明,文體學也可以應用於人工語言樣本,比如代碼。事實證明,軟體開發人員也會有指紋留下。
雷切爾·格林斯塔特(Rachel Greenstadt)是美國德雷塞爾大學計算機科學的副教授。艾林·卡利斯坎(Aylin Caliskan)是格林斯塔特的前博士生、現任喬治·華盛頓大學助理教授。他們兩人發現,代碼和其他形式的文體表達一樣,都是無法匿名的。在周五的DefCon黑客大會上,這兩位科學家將展示他們的多項研究。在研究中,他們利用機器學習技術對代碼樣本的作者進行去匿名化操作。例如,他們的工作可能在剽竊糾紛中發揮作用,但同時它也有隱私問題,尤其是對成千上萬向世界貢獻開源代碼的開發者而言。
如何對代碼進行去匿名化?
下面用一個例子對研究人員如何使用機器學習來發現代碼的作者進行簡單解釋。首先,他們設計的演算法識別了在一些代碼樣本中找到的所有特徵,有很多不同的特徵。想想自然語言中存在的每一個方面:有你選擇的單詞,你把它們組合在一起的方式,句子長度,等等。格林斯塔特和卡利斯坎隨後縮小了功能範圍,使其只包含了真正區別於其他開發者的功能,將列表從數十萬縮減到大約50個。
研究人員不依賴底層特性,比如代碼的格式化方式。相反,它們創建「抽象語法樹」來反映代碼的底層結構,而非它的任意組件。他們的技巧類似於優先排序某人的句子結構,而不是在於他們是否縮進一個段落的每一行。
這個方法還需要一些別的工作來教一個演算法,讓它知道什麼時候應該發現另一個代碼示例。如果一個隨機的GitHub賬戶彈出並發布了一個代碼片段,格林斯塔特和卡利斯坎就不一定能夠識別背後的人,因為他們只有一個樣本可以使用。他們可能會說,這是一個他們從未見過的代碼開發人員。然而,格林斯塔特和卡利斯坎並不需要把一生的時間都花在代碼上,他們只需要幾個短的樣本。
例如,在2017年的一篇論文中,卡利斯坎、格林斯塔特和另外兩名研究人員證明,即使是存儲庫站點GitHub上的一小段代碼,也足以區分出各個編碼者之間的區別,而且精確度相當之高。
最令人印象深刻的是,卡利斯坎和其他研究團隊在另一篇論文中表示,只用他們編譯的二進位代碼就可以去匿名化程序員。在開發人員編寫完一段代碼後,一個名為編譯器的程序將它轉換成一系列的1和0,機器可以讀取這些1和0,稱為二進位。對人類來說,這簡直就是胡說八道。
卡利斯坎和與她一起工作的其他研究人員可以將二進位分解回C++編程語言,同時保留開發人員獨特風格的元素。假設您寫了一篇論文,使用谷歌翻譯將其轉換為另一種語言。雖然文本看起來可能完全不同,但是您編寫的方式元素仍然嵌入到了語法之類的特性中。代碼也是如此。
「風格被保留了下來,」 卡利斯坎說。「當文本是以個人學習為基礎時,就會有很強的風格特徵。」
為了進行二進位實驗,卡利斯坎和其他研究人員使用了谷歌 Code Jam年度編程挑戰賽的代碼樣本。機器學習演算法正確地識別出了100名個體程序員,而只用了96%的時間。每個人使用8個代碼樣本。即使將樣本量擴大到600名程序員,該演算法仍能在83%的時間內準確識別。
對剽竊和隱私的影響
格林斯塔特和卡利斯坎說,他們的工作可以用來判斷編程學生是否有抄襲行為,或者開發者是否違反了僱傭合同中的非競爭條款。安全研究人員可能會使用它來幫助確定創建一種特定類型惡意軟體的可能開發人員。
更令人擔憂的是,一個威權政府可能會使用去匿名化技術來識別背後的個人,比如說,一個規避審查的工具。這項研究還對那些為開源項目做貢獻的開發人員有隱私方面的影響,特別是如果他們一直使用相同的GitHub賬戶的話。
格林斯塔特說:「人們應該意識到,在這種情況下,要百分之百地隱藏自己的身份是非常困難的。」
例如,格林斯塔特和卡利斯坎發現,一些現成的混淆方法,即軟體工程師用來使代碼更複雜、安全性更高的工具,並不能成功地隱藏開發人員的獨特風格。然而,研究人員說,在未來,程序員可能能夠使用更複雜的方法隱藏他們的風格。
「我確實認為,只要我們繼續進行下去,將會發現一件事,那就是什麼樣的混淆方法能夠掩蓋這些東西。」 格林斯塔特說:「我不相信,最後發現的結論是你做的每件事都是有跡可循的。無論如何,我希望不是這樣。」
例如,在另一篇論文中,由華盛頓大學的露西 ·西姆科(Lucy Simko)領導的團隊發現,程序員編寫代碼的目的可以是讓演算法相信自身是別的程序員編寫出來的。該團隊發現,即使開發人員沒有專門訓練過如何創建贗品,他們也可能會對自己的「編碼簽名」進行惡搞。
未來的研究方向
格林斯塔特和卡利斯坎還發現了許多關於編程本質的有趣見解。例如,他們發現經驗豐富的開發人員比新手更容易識別代碼。你越熟練,你承擔的工作就越獨特。部分原因可能是因為初級程序員經常從Stack Overflow這樣的網站複製粘貼代碼解決方案。
同樣,他們發現,解決更困難問題的代碼示例也更容易屬性化。通過使用62名程序員組成的樣本,這62名程序員每個人都解決了7個「簡單」的問題,研究人員在90%的時間裡都能夠將他們的工作去匿名化。當研究人員使用7個「困難」問題樣本時,他們的準確率下降到95%。
在未來,格林斯塔特和卡利斯坎想要了解其他因素是如何影響一個人的編碼風格的,比如當同一個組織的成員在一個項目上合作時會發生什麼。他們還想探究一些問題,比如來自不同國家的人是否會以不同的方式編碼。例如,在一項初步研究中,他們發現他們可以區分加拿大和中國開發者編寫的代碼樣本,準確率超過90%。
還有一個問題,相同的屬性方法是否可以在不同的編程語言中以標準化的方式使用。目前,研究人員強調,儘管到目前為止他們的方法已經被證明是有效的,但是去匿名化代碼仍然是一個神秘的過程。
「我們仍在努力弄清楚哪些是真正可以屬性化的,哪些不是。」格林斯塔特說:「有足夠的理由證明,這些應該引起關注,但我希望這不會導致任何人都不公開發表意見的糟糕情況發生。」
※小交易所的突圍戰
※易凱資本王冉:我們對當下中國資本市場溫度的一些感知
TAG:獵雲網 |