歡迎光臨
每天分享高質量文章

認罪吧,你的代碼已經出賣了你!

導讀:指紋出賣你、聲音出賣你、筆跡出賣你……

這都不算什麼——

現在,你寫的代碼也能出賣你的身份了!

編譯:狗小白、羅然、錢天培

來源:大資料文摘(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: 還敢亂寫代碼嗎

歡迎留言與大家分享

覺得不錯,請把這篇文章分享給你的朋友

轉載 / 投稿請聯繫:[email protected]

更多精彩,請在後臺點擊“歷史文章”查看

赞(0)

分享創造快樂