導讀:指紋出賣你、聲音出賣你、筆跡出賣你……
這都不算什麼——
現在,你寫的程式碼也能出賣你的身份了!
編譯:狗小白、羅然、錢天培
來源:大資料文摘(ID:BigDataDigest)
近日,在Drexel大學任職電腦科學的副教授Rachel Greenstadt,及其他的博士學生(現為George Washington大學助教)Aylin Caliskan公佈了他們的最新研究成果:人類的程式碼就和語言一樣,也是有“身份”的。
研究文體學(文體學即對語言風格的計量分析)的學者早就明白,寫作是一個獨特、個體化的過程。你選擇的詞彙、句式,還有語法結構都打上了你的個人印記。給自動化工具足夠的訓練資料,比如論壇文章,自動化工具可以準確地判斷出其作者。
Rachel Greenstadt和Aylin Caliskan的研究證明瞭,文體學也可運用於人工語言樣本。
比如說程式碼。
在今年的DefCon駭客會議上,Rachel Greenstadt和Aylin Caliskan展示了他們對程式碼樣本作者去匿名化的研究成果。
01 如何去匿名化程式碼
對於研究者如何使用機器學習去匿名化程式碼,這裡給出一個簡略的解釋。
首先,他們設計的演演算法判別選取程式碼樣本里的特徵。
這些特徵包含很多方面,比如自然語言所具有的典型特徵:詞語的選擇、組詞的方式、句子的長短等等。Greenstadt和Caliskan將這些特徵進行了多倫篩查,最終從數十萬個特徵中選取了50個左右。
該研究不依賴於類似程式碼格式這樣的低維特徵,而是創造了一種反應程式碼底層架構而非任意成分的“抽象句法樹”。
他們的技術類似於在文字去匿名化時,對該文字的句型結構劃分優先順序,而非判斷段落是否有首行縮排。
當然了,這方法的執行需要用一定的程式碼樣本來訓練演演算法,這樣之後再碰到這個人的程式碼樣本時,演演算法就能判斷出作者來。
如果是一個隨機選取的GitHub賬號,那Greenstadt和Caliskan就沒法判斷出程式碼作者了,因為他們手頭只有一個樣本。
雖說如此,他們所需要的樣本量也是極少的。
舉例來說,在他們之前的一篇論文中,Caliskan, Greenstadt還有其它兩個研究人員證明瞭,我們只需GitHub庫裡小片段的程式碼就能夠準確判別它的作者。
最嘆為觀止的是,Caliskan和一組其它研究者在另一篇論文中展示,他們只需編譯的二進位制程式碼就能夠對程式設計人員去匿名化了。
在開發人員寫完一段程式碼後,一個叫編譯器的程式將其轉化為可被電腦讀取的一系列0和1的二進位制程式碼。對人類來說,這串東西看起來像天書。
Caliskan和她的同事們可以將二進位制反編譯為C++語言,同時能保留開發者獨特風格的元素。
想象你寫了篇文章,再用谷歌翻譯將其轉為其它語言。雖然文字看起來完全不同了,但是那些你寫文章風格的元素依然植入在其中。
對程式碼來說也是同樣的道理。
“每個人的程式碼風格其實都是清晰可區分的。”Caliskan說道。
Caliskan和同事們從谷歌的年度程式設計挑戰賽裡選取程式碼樣本,來進行二進位制測試實驗。機器學習演演算法對100個程式員進行識別,訓練集為選取每個開發者8個程式碼樣本,該演演算法能夠在96%的時間內正確地識別出這100個獨立的程式員。
當樣本人數擴充套件為600個程式設計人員時,該演演算法仍然可以在83%的情況下進行準確識別。
02 抄襲的執法者?隱私的天敵?
Caliskan和Greenstadt表示,他們的成果可以用來分辨學生的程式碼是否存在抄襲,或者開發人員有沒有違背僱傭合同裡的非競爭性條款。安全人員也可能藉此找出電腦裡的惡意軟體是出自誰手。
不過令人擔心的是,獨裁政府也可以使用去匿名化技術來追蹤程式猿,例如找出“科學上網”軟體的幕後推手。
同時,這個研究對為開源專案貢獻了開發者也帶來了隱私方面的問題,這尤其會困擾那些常年堅守同一個Github賬號的程式猿們。
Greenstadt說:“人們應該意識到,在這些(開源)情況下,他們是很難做到百分百匿名的。”
舉例來說,Greenstadat和Caliskan發現,那些軟體工程師意圖使程式碼更複雜和安全而使用的非定製化模糊方式或工具,在隱藏開發者的獨特風格方面並沒有什麼卵用。但研究者表示,也許在未來,開發者能夠用更複雜的方式來隱匿他們的程式設計風格。
Greenstadt說:“隨著研究的進行,我相信我們的標的是找到什麼樣的模糊化工具能夠隱匿風格”,“我不相信研究的最終結果是,你做的任何匿名化努力最終都是有跡可循的。怎麼說呢,希望不是這樣吧。”
比如,在另一篇文章中,華盛頓大學的Lucy Simko領導的小組發現,程式設計者可以寫份程式碼來欺騙演演算法,使之以為這是其他人所作。小組發現,即使程式設計者未特意學習偽造,他還是能夠弄份假的“程式碼印跡”。
03 未來工作
Greenstadt和Caliskan揭示了一些程式設計本質的有趣見解。比方說,他們發現,經驗豐富的開發者比生手更容易透過個人風格被找出。越是技術嫻熟,顯然你的作品更獨特。部分原因也在於,生手常常從Stack Overflow這樣的網站裡複製貼上程式碼方案。
類似的結論還有,應對複雜問題的程式碼樣本更容易被去匿名化歸類。對同樣的62個程式設計人員的程式碼抽取程式碼樣本進行分析,當這七個程式碼樣本是應對“簡單”問題時,研究人員能夠在90%的時間內對他們的工作進行去匿名化;當抽取七個程式碼樣本應對“複雜”問題時,正確率達到了95%。
未來,Greenstadt和Caliskan打算研究其它影響碼農程式設計風格的因素,比如同一機構的程式設計人員合作某專案時,其個人風格是否會受到影響。他們也還想瞭解,不同國家的程式設計人員的風格是否有所不同。例如,在一個初步研究中,他們發現區分加拿大程式設計人員和來自中國的程式碼樣本的正確率高於90%。
此外,這樣的研究是否對任何程式語言都適用,也是個問題。就目前而言,研究者強調,雖然目前的研究方法看起來行之有效,程式碼去匿名化仍然是一個充滿疑問的過程。
Greenstadt說:“我們還在試圖找出能夠真正鑒定個人印跡的歸類因素。雖有充分的理由證明,個人印跡的問題值得程式設計人員關註,但我仍然希望這不會減少人們開源的動力。”
相關報道:
https://www.wired.com/story/machine-learning-identify-anonymous-code/
更多精彩
在公眾號後臺對話方塊輸入以下關鍵詞
檢視更多優質內容!
PPT | 報告 | 讀書 | 書單
Python | 機器學習 | 深度學習 | 神經網路
區塊鏈 | 揭秘 | 乾貨 | 數學
猜你想看
Q: 還敢亂寫程式碼嗎?
歡迎留言與大家分享
覺得不錯,請把這篇文章分享給你的朋友
轉載 / 投稿請聯絡:baiyu@hzbook.com
更多精彩,請在後臺點選“歷史文章”檢視