[AI 應用落地]裝陌生人寫的程式之前,先讓 AI 把原始碼讀一遍

一個 60 顆星、沒有授權條款的傳檔小工具,我請 AI 花五分鐘讀完 280KB 原始碼,找出四個該關掉或避開的地方,再挑三條親手核對。附裝軟體前可以問 AI 的四個問題。

視其所以,觀其所由,察其所安。人焉廋哉?人焉廋哉?
—— 《論語・為政》
孔子說看一個人,要看他做什麼、怎麼做、做完之後安心在哪裡,這樣人就藏不住。我這幾天把這句話用在一個程式上。
前幾天我要把一個小檔案從電腦傳到手機,才發現家裡幾台裝置之間,沒有一條順手的傳檔路。後來在 GitHub 看到一個叫 owldrop 的小工具(github.com/Rastavich/owldrop),它把 Tailscale 內建的傳檔功能做成一個有收件匣的視窗:收到的檔案一鍵存下來,想傳給哪台點一下就好。
我想裝。可是它有幾個地方讓我停下來:60 顆星、作者我不認識、專案沒有標授權條款,而它的工作就是經手我收到的每一個檔案。
以前遇到這種情況,我只有兩個選項:相信它,或放棄它。這次我多試了一個:請 AI 先把原始碼讀一遍。
我請 AI 回答的四個問題
「幫我看看安不安全」這種問法太寬,AI 很容易回一段讓人安心的話,你也沒辦法對答案。我給它四個具體的問題,每一個答案都要附上檔名和行號:
- 它會連到哪些外部網址?送出什麼?預設開著嗎?
- 它開了哪些門?誰能從外面連進來?
- 它會不會自己更新?新版下載下來,有沒有確認是作者本人發的?
- 收到的檔案會被怎麼處理?會不會被存到別的地方,或被直接打開執行?
程式碼是 41 個 Go 檔,大約 280KB,我自己一個下午也讀不完。AI 讀完花了五分鐘出頭。
我那天實際貼給 AI 的提問
上面四題是濃縮版。下面是我那天實際貼給 AI 的內容,拿掉了我電腦上的路徑和編譯步驟那一題。想用的話可以整段複製,把專案網址換成你要查的那一個:
請審查這個開源專案的原始碼:(貼上 GitHub 網址)。我想知道能不能安心裝在自己的電腦上。只讀,不要執行專案裡的任何程式,不要安裝套件。每一項都給結論,並附檔名和行號。
- 列出程式會連到的所有外部網址。每一個:預設開還是關?送出什麼資料?能不能關?
- 有沒有回傳使用資料?送了什麼、送去哪裡、預設開不開、怎麼關?
- 會不會自動更新?從哪裡下載?有沒有確認下載檔的簽章或指紋?會不會自己安裝?
- 預設聽哪個位址和連接埠?各種對外分享的模式預設開不開?怎麼確認連進來的人是誰?
- 收到的檔案會存到哪裡?會不會被人用 ../ 塞進別的資料夾?會不會被直接執行?
- 專案裡有沒有看不懂的執行檔、很長的亂碼字串,或會執行外部指令的地方?
- 用到的套件裡有沒有奇怪的?
- 如果要裝,哪些功能要保持關閉?
最後給一句總評:可以裝、關掉某些功能後可以裝,或不建議裝,並說明理由。
第六題幫我找到一個意外:專案裡夾著兩個舊版的 Linux 執行檔,一個 21.6MB、一個 14.8MB,是這個程式改名前留下的,沒有任何地方用到它們。它們不影響 Windows 版,可是如果我沒問,就不會知道專案裡躺著兩個我沒辦法檢查內容的東西。第八題最實用,它直接告訴我裝好之後要去設定裡關哪幾個開關。
先講它做對的事
先講公道話。這個程式預設只聽自己這台電腦(127.0.0.1),網路上的其他裝置連不進來。會改東西的指令,都要帶一組隨機產生的通行碼。收到的檔名會先去掉路徑,別人沒辦法用 ../ 這種寫法把檔案塞進別的資料夾。一個小專案做到這些,看得出作者有花心思。
四個我決定關掉或避開的地方
第一,它預設會回傳使用資料給作者。內容是版本、作業系統、事件名稱(例如「存了一個檔」)、時間,和一組隨機的安裝編號,不含檔名。作者在說明文件裡有一整節交代這件事,也教你怎麼關。我關了。
第二,「區網模式」打開之後,程式會對所有網路開門。說明文件寫的是「只開放給你的 tailnet」,程式碼裡這個模式綁的卻是 0.0.0.0,也就是每一張網卡都聽,而且接受任何 IP 位址來敲門。筆電帶去咖啡廳連公共 Wi-Fi,同一個網路的人就有機會碰到它。文件和程式碼在這裡對不上,我不開這個模式。
第三,自動更新這一段,AI 在程式裡找不到「確認下載檔是作者發的」這一步。更新清單和執行檔放在同一個 GitHub 帳號底下,萬一帳號被盜,兩樣可以一起被換掉。
第四,收到 .exe 這類檔案時,按「開啟」會直接執行。介面會先跳警告,名單有四十多種副檔名,作者有想到這件事。我的做法是收到執行檔,一律不在它裡面按開啟。
AI 講的話,我怎麼驗
AI 讀程式碼很快,但它也會講錯。所以我從報告裡挑了三條最關鍵的,自己打開原始碼對。
回傳預設開著這一條,我打開 main.go,設定的預設值寫著 Telemetry: true。自動更新這一條,程式裡的預設版號是 dev,只有符合「數字.數字.數字」格式的正式版號才會去查新版。預設只聽本機這一條,程式裡寫的就是 127.0.0.1。
三條都對。每一條我花不到一分鐘,因為 AI 給了檔名和行號,我不用自己在 280KB 裡找。
它也有一條老實說不知道:自動更新用的外部元件,會不會在底層比對檔案的指紋,那段程式不在這個專案裡,它沒辦法確認。我喜歡這種回答,它把「查不到」和「沒有」分開講了。
最後我怎麼裝
我拿原始碼自己編譯。原因跟第三點有關:原始碼我看過了,作者編好的安裝檔我看不到裡面,兩者是不是同一份東西,我無從確認。自己編,就只信我看過的那一份。
編譯時我刻意不填版號,這樣自動更新整段不會啟動,以後要升級,就重新讀一次原始碼、再編一次。第一次啟動之前,我先寫好設定檔把回傳關掉,所以連第一筆資料都不會送出去。
裝好後我查了一次:它只在本機開了一個門,對外連線是零條。兩台電腦裝的是同一個檔案,我比對過兩邊的檔案指紋,一模一樣。
這招的邊界
AI 讀過一遍,程式照樣可能有問題。它會漏看,而且它讀的是這個專案本身,沒有把用到的每一個套件都讀一遍。它給我的是一張地圖,告訴我該去哪裡看、該關哪些開關。
這招對大型軟體也不划算。瀏覽器、作業系統這種幾百萬行的東西,靠的是廠商的信用和一整個產業在檢查。它最適合 owldrop 這種工具:小、新、星星不多、作者你不認識,卻要碰你的檔案或網路。
不會寫程式也能用。那四個問題不需要看懂程式碼,只要會把網址貼給 AI。看不懂它的回答,就追問一句「用國小生聽得懂的話再講一次」。
帶得走的一件事
我從這次帶走的一件事:AI 說的話要附出處,我對得回去的那一條,才算我知道。
下次你要裝一個不熟的小工具之前,可以試試我這次的做法:把它的網址貼給 AI,只問一句「它會連到哪些外部網址?預設開著嗎?每一條附檔名和行號」。把它列出的網址抄在一張便利貼上,挑其中一條自己打開原始碼對一次,在旁邊寫下「對」或「不對」。做到貼上網址那一步就算完成,對答案是加分。這個問法換到手機也通:下一次 App 跟你要權限時,先問它要這個權限拿去做什麼。