セキュリティアラート: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のroot ユーザーとして展開したユーザー。

  • バージョン1.54.5より前に、Unix rootユーザーとしてsass-embedded npmパッケージをインストールしたユーザー。

  • バージョン1.56.2より前に、コミュニティが管理するsass-embedded RubyGemsパッケージの「非ネイティブ」バージョンをUnix rootユーザーとしてインストールしたユーザー。

  • 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はリテラル8進数をサポートしておらず、10進数から8進数への変換を間違えたようです。実際に設定されたアクセス許可は、757(所有者および他のユーザーの場合は読み取り/書き込み/実行、グループの場合は読み取り/実行)、および654(所有者の場合は読み取り/書き込み、グループの場合は読み取り/実行、他の ユーザーの場合は読み取り専用)でした。

これは数年間気づかれず、先週@ntkme氏が問題に気づき、cli_pkgの修正を提供してくれました。

何がされたのか?何がされたのか? パーマリンク

アーカイブのアクセス許可を正しく設定するcli_pkg 2.1.7をリリースしました。さらに、Dart Sass、Dart Sass Embedded、およびSass Migratorリポジトリのすべての.tar.gzファイルを更新して、ファイル所有者のみに書き込みアクセス許可を制限するように修正しました。ここで、および@SassCSS Twitter アカウントで脆弱性を発表しています。