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