安全警報:Tar 許可權

釋出於 2022 年 12 月 10 日,作者 Natalie Weizenbaum

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 根 使用者身份解壓縮的使用者。

  • 在 1.54.5 版本之前以 Unix 根使用者身份安裝 sass-embedded npm 包的使用者。

  • 在 1.56.2 版本之前以 Unix 根使用者身份安裝社群維護的 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 根使用者身份解壓縮存檔或顯式傳遞 -p/--preserve-permissions 標誌時,解壓縮檔案的許可權會根據存檔的元資料進行設定。由於元資料不正確,具有低許可權帳戶訪問許可權的攻擊者將能夠覆蓋可執行檔案,並在執行 後提升其許可權。

這是怎麼發生的?這是怎麼發生的? 連結

Dart Sass 使用名為 cli_pkg 的 Dart 包自動部署到各種不同的釋出平臺,該包也是由 Sass 團隊編寫和維護的。此包使用 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 帳戶 上釋出此漏洞資訊。