1 ポイント 投稿者 GN⁺ 4 시간 전 | 1件のコメント | WhatsAppで共有
  • npm v12では、npm installセキュリティ関連のデフォルト設定が自動実行・自動解決から明示的な許可方式に変わり、npm 11.16.0以降では警告によって事前に確認可能
  • allowScripts のデフォルト値が無効に変わり、明示的に許可していない依存関係の preinstallinstallpostinstall スクリプトと、暗黙的な node-gyp rebuild、git・file・link 依存関係の prepare スクリプトの実行をブロック
  • npm approve-scripts --allow-scripts-pending でブロック対象となるパッケージを確認し、npm approve-scriptsnpm deny-scripts で許可・拒否を決めたうえで、生成された allowlist を package.json にコミットする必要あり
  • --allow-git のデフォルト値none に変わり、--allow-git で明示的に許可していない直接・推移的 Git 依存関係の解決を停止
  • Git 依存関係の .npmrc が、--ignore-scripts 使用中であっても Git 実行ファイルを上書きできてしまうコード実行経路を遮断
  • --allow-remote のデフォルト値none に変わり、--allow-remote で明示的に許可していない https tarball などのリモート URL 依存関係の解決を停止
  • --allow-file--allow-directory のデフォルト値は npm v12 で変更なし
  • 準備手順としては、npm 11.16.0以降へアップグレードした後に通常のインストールを実行して警告を確認し、信頼できるパッケージのみを承認し、アップグレード後は承認済みスクリプトだけが引き続き実行される形となる
  • 関連ドキュメント: npm approve-scripts, npm deny-scripts, allow-scripts config

1件のコメント

 
GN⁺ 4 시간 전
Hacker Newsのコメント
  • npmがGitHubに買収されたことをどうして見落としていたのかわからないが、急にいろいろ腑に落ち始めた
    Nodeエコシステムのこれほど重要な一部が収まる場所として、これよりひどい家はなかなか思い浮かばない

  • postinstall スクリプトはずっと前に廃止されているべきだったし、NPMパッケージのがんのような存在だ
    何かを取得すると、深くネストされた制御不能な postinstall が無作為に実行されることがあまりに多い
    いったい誰がどの時点でこれを良いアイデアだと思ったのかわからない

    • post-install スクリプトへの懸念の核心があまり理解できない
      たいていの場合、パッケージ化された依存コードはどうせどこかの時点で実行するし、普通はインストール工程と同じ権限で実行する
      なら、こうした設定スクリプトは良くも悪くも、エントリーポイントを npm から importrequire が起きる場所へ移すだけだ
      エコシステム全体がDenoのようなサンドボックス環境へ移行しない限り、せいぜい小さなつまずきにしか見えない。それが計画なのかもしれないが
    • 絶対にそうすべきではないし、正当なユースケースはたくさんある
      すぐ思いつく例として https://www.npmjs.com/package/patch-package がある
      今のヒステリーがこういう無意味な決定につながらないことを願う
  • この件は10年前に公になって以来、NPM内部で何百回も議論されてきたはずだ
    Shai Halud のせいで、もう無視するには大きくなりすぎた

    • JavaScriptの歴史は実質的に開発者的な考え方を凝縮したものみたいで好きだ
      「そのうち直します」は、ほぼ常に「くそっ、もう直さなきゃ」になる
    • いいね、次はPythonの番
  • 現在のLTS版Node、記憶が正しければ22、24、26について、このセキュリティ修正の恩恵を受けられるようバンドルされた npm を v12 に上げる予定なのか気になる
    今はどれも npm v11 を含んでいる

    • 過去にもNodeの中間リリースでnpmのメジャーバージョンアップが行われたことがある
      v18.19.0[1] と v20.10.0[2] で npm 9 から 10 へ上げた
      [1]: https://nodejs.org/en/blog/release/v18.19.0#npm-updated-to-v...
      [2]: https://nodejs.org/en/blog/release/v20.10.0
    • 既定値の変更なのでセキュリティ態勢の変化とは言えるが、セキュリティ修正そのものはすでに誰でも適用できる
      記事にある通り、適切な既定値を設定すれば終わりだ
      この変更のいちばん良い点は、既定値が変わることで、新しい開発者がただ install を実行しただけでこうした設定が有効だと勝手に期待する厄介なパッケージが即座に壊れるのを目にすることだ
      たとえば、スクリプトが実行可能であることを前提にする慣行をやめさせられるかもしれない
  • 記事だけでは明確ではないが、スクリプトの許可リストはグローバル設定ではなくパッケージごとの許可をサポートしているようだ
    特定パッケージにだけスクリプトを許可する組織単位のルールを維持しやすくなりそうだ
    こういう形でパッケージマネージャー設定の危険な既定値を防ぐのに使えるリンターがあるのか気になる

    • grep で十分では?
  • まだYarnを使う理由があるのか気になる
    Yarnもサプライチェーン攻撃を防ぐ保護機構を実装しているのだろうか
    これまでは pnpm しか知らなかったが、npm も追随したのは良いことだ

    • もちろんある
      最新のYarnリリースである 4.x は過剰なくらい決定的な動作を保証していて、チーム全体で一貫した動作を期待できる
      機能面では小さなディテールが多く、慣れてくると積み重なって大きな違いになる
      次のメジャーリリースでも、より良い性能と、その性能向上に依存してこれまで実装できなかった機能で同じ方向をさらに押し進める予定だ
      参考までに、私はYarnのリードメンテナーだ
    • 初期から v3 まで Yarn を使っていたプロジェクトで働いていたが、とても遅いが動く
      サプライチェーン保護機能もある
      結局我慢できず pnpm に移行し、CI とローカル開発マシンの両方でインストールがずっと速くなった
      LLM の助けを借りて、移行には1日ほどかかった
    • 差別化要因の1つは選択可能なインストール戦略で、パッケージを node_modules に展開せず圧縮アーカイブから直接実行する方式だ
      https://yarnpkg.com/features/pnp
      Javaで .class ファイルのディレクトリツリーではなく .jar を使うのとかなり似ている
      ただし少しハッキーで、エディタやツールの対応はまちまちだ
      小さなファイルの数が大幅に減るので、やむを得ず Windows で作業しなければならないなら特に速いかもしれない
      アーカイブを git リポジトリに入れることもできるので、インターネットやパッケージレジストリへの依存をなくせる
    • NPM が何をしているのかは知らないが、Yarn は NPM より依存関係のインストールがずっと速い
    • 私のコメントに反対票を入れている人たちは、質問に答えてくれてもいい
      本当に答えを知らない
  • npm が GitHub の所有だとは知らなかった
    それでいろいろ説明がつく

    • NPM Is Joining GitHub - https://news.ycombinator.com/item?id=22594549 (2020年3月16日、コメント571件、1829ポイント) - https://github.blog/news-insights/company-news/npm-is-joinin...
      時間が経ってから読むと興味深いものもある
      最上位コメントは「Microsoft が何でもうまくやるわけではないが、GitHub 買収は正直予想よりずっとうまく進んだ。GitHub に Microsoft 中心の方針を押し付けるのではなく、Microsoft のほうが製品面で GitHub のやり方を多く取り入れた。GitHub は今でも別会社のように運営されている」という内容だった
    • NPMという会社は2020年にはほぼ倒産寸前だった
      ベンチャー投資は受けていたが、持続可能な事業モデルを見つけられなかった
      GitHub がエコシステムを救うために買収し、この買収が GitHub に大きな利益をもたらしたわけでもほとんどない
    • たいていの人はこれを知っているが、本当に多くを説明してくれる理由はGitHub が Microsoft の所有だという点だ
      そして Microsoft は GitHub を Azure に移した
    • GitHub の所有だとは知っていたが、npm ブログではなくGitHub ブログのリリースノートを直接見たのは今回が初めてだ
  • package.json の許可リストはパッケージのバージョンまで固定するのか、それともパッケージ名だけを固定するのか気になる

  • allowScripts の既定値が無効なのは良いことだ
    [時計を見る] 18か月遅れで pnpm を追いかけている感じか?

    • Java の Maven にはそんなものはなかったし、必要だと感じたこともない
      JavaScript 側ではこれは何のためなんだ?