安全性警示:Tar 權限

由 Natalie Weizenbaum 於 2022 年 12 月 10 日發布

Sass 團隊最近由多產的外部貢獻者 @ntkme 提醒,我們的發布 流程存在安全性問題。

TL;DRTL;DR 永久連結

如果您使用的是 Linux 或 Mac OS,請執行 ls -ax path/to/sass。如果第一欄的最後一組字母包含 w,表示您很脆弱

Vulnerable:
-rwxr-xrwx 1 nweiz primarygroup 407 Dec 13 12:33 sass-1.56.2/sass

Not vulnerable:
-rwxr-xr-x 1 nweiz primarygroup 407 Dec 13 12:33 sass-1.56.2/sass

如果您使用的是 sass-embedded 套件,請對 node_modules/sass-embedded/dist/lib/src/vendor/dart-sass-embedded/dart-sass-embedded 執行相同的操作。

誰受到影響?誰受到影響?永久連結

雖然我們不認為這個問題對絕大多數使用者來說會造成問題,但它確實會影響以下 群組

  • 從 Dart Sass 網站下載獨立的 Dart Sass、Dart Sass Embedded 或 Sass Migrator .tar.gz 檔案,並以 Unix root 使用者身分解壓縮它們的使用者。

  • 在版本 1.54.5 之前,以 Unix root 使用者身分安裝 sass-embedded npm 套件的使用者。

  • 在版本 1.56.2 之前,以 Unix root 使用者身分安裝社群維護的 sass-embedded RubyGems 套件的「非原生」版本的使用者。

  • 在多使用者系統上,從 Dart Sass 網站下載獨立的 Dart Sass、Dart Sass Embedded 或 Sass Migrator .tar.gz 檔案,並在解壓縮 時明確傳遞 -p/--preserve-permissions 旗標的使用者。

透過 sass npm 套件、Homebrew 或 Chocolatey 安裝 Dart Sass 的使用者絕對不會有風險,Windows 使用者也不會有風險。

我們強烈建議這些脆弱群組的使用者刪除並重新安裝 Sass。GitHub 上的所有 .tar.gz 檔案都已清除,移除了漏洞,因此您可以重新安裝先前使用的相同版本,而不需要升級到最新版本。

這是一個權限提升問題,表示它可能允許假設的攻擊者存取電腦中權限較低的帳戶,並將其存取權限提升到帳戶的權限。不過,這也表示只有在攻擊者已存取電腦中的帳戶時,這才會有風險。

出了什麼問題?出了什麼問題? 永久連結

我們無意間上傳了 .tar.gz 檔案,其權限中繼資料表示所有使用者都可以覆寫可執行檔案,而不仅仅是擁有者。

在大部分情況下,在解壓縮檔案時會忽略此中繼資料,且權限僅設定為執行解壓縮的使用者可寫入。不過,在以 Unix root 使用者身分解壓縮檔案,或明確傳遞 -p/--preserve-permissions 旗標時,解壓縮檔案的權限會根據檔案的中繼資料設定。由於中繼資料不正確,存取權限較低的帳戶的攻擊者就能夠覆寫可執行檔案,並在執行後提升其權限。

這是如何發生的?這是如何發生的? 永久連結

Dart Sass 會自動部署到各種不同的發行平台,使用由 Sass 團隊編寫並維護的 Dart 套件 cli_pkg。此套件使用 Dart archive 套件為獨立發行套件產生 .tar.gz 檔案,然後上傳到 GitHub,最初撰寫使用此套件的程式碼時,我寫了以下 函數

ArchiveFile fileFromBytes(String path, List<int> data,
        {bool executable = false}) =>
    ArchiveFile(path, data.length, data)
      ..mode = executable ? 495 : 428
      ..lastModTime = DateTime.now().millisecondsSinceEpoch ~/ 1000;

我的用意是將可執行模式設為 755(擁有者可讀/寫/執行,其他使用者只能讀/執行),將不可執行模式設為 644(擁有者可讀/寫,其他使用者只能讀取)。然而,Dart 不支援文字八進位數字,而且我一定做錯了十進位轉換為八進位的轉換。實際設定的權限為 757(擁有者及其他使用者可讀/寫/執行,群組可讀/執行)和 654(擁有者可讀/寫,群組可讀/執行,其他 使用者只能讀取)。

這持續了好幾年都沒有人發現,直到上週 @ntkme 通知我們這個問題,並提供了一個 cli_pkg 的修正程式。

做了哪些事?做了哪些事? 永久連結

我們已發布 cli_pkg 2.1.7,其中正確設定了封存權限。此外,我們已更新 Dart Sass、Dart Sass Embedded 和 Sass Migrator 儲存庫中的所有 .tar.gz 檔案,以正確地限制寫入權限,僅限於檔案擁有者。我們在此處和 @SassCSS Twitter 帳戶 上宣布此漏洞。