他一怒之下刪除11行程式碼 互聯網遭殃

他一怒之下刪除11行程式碼 互聯網遭殃
Photo Credit: Ian Lishman / Juice Images / Corbis / 達志影像
我們想讓你知道的是

刪除短短11行程式碼,竟然會令Facebook、Reddit、Netflix及Spotify等大型網站出現錯誤?早前互聯網的一次意外,揭露了不少網站的弱點。

唸給你聽
powered by Cyberon

現時每個網站都是一個龐大架構,技術人員建站時不可能獨力寫出全部程式碼,通常會使用其他人寫好的套件,而這些套件又很可能用到另一些人的套件。不少程式員都會在網絡上開放源碼,讓世界各地的程式員能夠使用其成果,互相協助。

一層又一層的程式碼,令不少開發人員容易忽略其網站依賴一些不由他們控制的套件,一旦這些套件發生問題,可能會造成骨牌效應,使網站出錯。近日一名程式員就因為刪去11行程式碼,使數以千計的開發人員、管理人員從記錄中發現錯誤訊息。

共享小工具

這場網絡小意外的成因之一,是JavaScript模組庫npm。npm讓使用程式語言JavaScript的開發人員,能夠輕鬆分享他們所寫的程式碼,並再日後重用。這些程式碼多數只為解決特定問題,像一些方便的小工具般,當有人「發明」了後所有人都能直接使用,通常稱為包(package)或模組(module)。

因此npm既是模組管理系統,也是一個模組庫,負責管理模組庫的是npm公司,創辦人之一是npm的創造者Isaac Z. Schlueter。npm公司容許任何人以開放源碼方式,把他們的模組上載至npm的公開庫中,讓其他人自由使用。

名字的爭拗

造成是次意外的主角、來自加州奧克蘭的程式員Azer Koçulu,原本非常擁抱及支持npm,不但在npm上發佈了273個模組,更會大力宣揚npm。他早前開始設計一件小工具,並把這項計劃以“kik”之名註冊到npm。然而開發流動通訊軟件Kik Messenger的公司Kik Interactive卻認為,Koçulu佔用了該公司的名字。

3月11日,Kik公司聘請的專利代理人Bob Stratton傳電郵給Koçulu,指該公司將會發佈一個重要的軟件包,名字同樣叫做“Kik”,希望他能夠把其計劃易名,以免用戶混淆兩者。Koçulu迅速回絕︰「抱歉,我正建立的開源計劃使用這個名字。」

Stratton表示他們無意冒犯,但那是個註冊商標。然後態度漸趨強硬,語帶威脅地指如果Koçulu堅持使用該名字,他們的律師會以上門、取下其帳戶等手段來保護其商標。最後Stratton希望雙方能夠妥協,不用律師來解決問題。

Koçulu回覆︰「哈哈,你確實冒犯了我。所以,(略去),別再回覆。」但Stratton再一次懇求Koçulu改名,因此他開出3萬美元的條件。

撤出npm

這個時候,Kik及Stratton向npm的支援團隊求助。Schlueter嘗試以溝通解決爭拗不果,最終npm認為一個有足夠知識的用家輸入「npm install kik」時,會預期安裝的東西跟Kik(通訊軟件)有關,因此根據其政策決定把模組的名字給予Kik公司。

Koçulu不接受這個決定。他對Schleuter說︰「我認識你多年,不曾想像你會站在企業專利律師的一方,來威脅開放源碼計劃的貢獻者。」失望的Koçulu更要求npm刪除其帳戶,以及他上載的所有模組︰「我不願再成為npm的一份子,如果你不刪除的話,讓我知道如何刪除,我應該有權刪除自己在npm的所有東西。」

Koçulu在網誌上解釋,事件令他意識到npm屬於私人領域,在這領域中企業比人民更有權力。但他參與開放源碼的計劃是因為他相信「權力歸於人民」,故決定刪除模組。Schleuter給了他一個指令,可以一次過把他在npm的所有東西刪除。他輸入指令,把在npm上註冊的273個模組悉數刪除——雖然有部份仍可在GitHub上找到。

重要的11行

在刪除模組之前,Koçulu未有警告其他使用者——特別是那些用上其模組的開發人員。在那273個模組當中,有一個稱為left-pad,只有11行程式碼︰

module.exports = leftpad;  function leftpad (str, len, ch) {    str = String(str);    var i = -1;    if (!ch && ch !== 0) ch = ' ';    len = len - str.length;    while (++i < len) {      str = ch + str;    }    return str;  }

這個模組的工作非常簡單︰把一個字串的開頭補上字符,使其長度符合要求。假如程式員希望所有字串都是5個字元,不夠長的話都用0補上,使用left-pad就能把「369」變成「00369」。

如此簡單的left-pad很受歡迎——根據npm統計數據,在過去一個月有超過200萬次下載。很多開發人員也許未曾聽過left-pad,但在不經意的情況下用到這個模組——可能是他們使用的模組用到left-pad,可能是他們使用的模組所使用的模組……如此類推。

一子錯,滿盤皆落索

當left-pad在3月23日上午5時30分(香港、台灣時間)於npm模組庫上消失後,npm技術團隊觀察到每分鐘有數以百計的故障訊息。其中一個受影響的大型軟件包是JavaScript編譯器Babel︰Babel用上一個稱為“line-numbers”的模組,而line-numbers使用到left-pad。Facebook、Netflix、Reddit及Spotify等都使用Babel來優化其程式碼,因此也受到left-pad的消失所影響。

不足10分鐘內,程式員Cameron Westland嘗試解決問題,他發佈了功能相同的模組,並命名為“left-pad”——因為Koçulu已刪除他的模組,Westland可使用相同名字,而且Koçulu原本的程式碼以開源方式發佈,任何人均可自由使用。

即使如此問題仍未解決。雖然npm的系統容許人們重新使用已被棄用的名字,但規定其版本號碼不能相同。Koçulu的left-pad版本是0.0.3,Westland的版本是1.0.0——而line-numbers指明要使用0.0.3版的left-pad。

npm跟Westland商討後,決定採取史無前例的舉動,以備份方式取消Koçulu的「取消發佈」指令。

在left-pad最初刪除後大約兩個半小時,npm解決了問題。Schleuter在官方博客中指出,Westland在10分鐘內重新發佈left-pad非常重要,而大約這個時間,使用npm的社群也取去其餘272個模組的名字——有些使用相同程式碼,有些發佈虛設模組——以防止惡意攻擊。Schleuter對他們表示謝意。

孰是孰非?

Koçulu相信開放源碼社群最終會提供真正自由的空間,來代替現時的npm。他在文章中對於刪除left-pad造成的破壞致歉,並提供解決辦法,及表示歡迎其他人管理其模組。

有人在Koçulu的文章處留言,認為npm的做法並無不妥,畢竟私人公司需要遵守法律,以免影響整個存庫運作。也有留言者表示「當我開始編寫kik時,不知道有一家同名公司」的解釋站不住腳,正如司機不能以「我不知道車速限制」為由來超速。

另一方面,有開發人員認同Koçulu的決定。例如有人留言指雖然Koçulu破壞了他的模組,但他欣賞Koçulu堅持自己的價值。亦有留言對Koçulu說「你做了正確的事」,即使帶來的麻煩使他需要在「上海醒來之前」把問題解決。

避免悲劇重演

Kik Messenger的負責人Mike Roberts事後公開雙方的電郵,表示他們的用詞並非完美,但用意僅是禮貌地提出要求,希望可以在npm中使用“Kik”這個名字,對於其言詞造成其他印象致歉。針對是次意外,npm亦提出數個方案,以免同類事件重演。

有分析認為問題源於開發人員太依賴使用模組,在一層又一層的程式碼下,常用的模組會被隱沒。開發人員應該減少依賴,才能減少出錯機會,也降低被攻擊的風險。

也人慨嘆竟然存在只有11行程式碼的模組,反問「我們是否忘記了如何寫程式」。更有人拿此事開了個玩笑,製作了leftpad.io這個網站,宣稱「為了避免這個可怕的悲劇在我們的生命中重演,left-pad.io提供所有"left-pad"的功能」。

看顏色、憑感覺還是只管統獨,其實越民主越「不看政見」投票 - 議員衝啥毀:2018年你不能錯過的選舉專題
或許你會想看
更多『新聞』文章 更多『新聞』文章 更多『Kayue』文章
Loader