lodashのセキュリティ・ホールを探る

1163 ワード

テキストリンク
最近、私が17年間書いたブログプロジェクトを再構築するつもりで、プロジェクトを開くと下図のセキュリティホールのヒントが見えました.
lodashを何年も使っていたのに、意外にも高危険な抜け穴があり、好奇心が私を探求し続けた.

探索プロセス


What


プロジェクトの下で実行:
- npm audit

図中のウェブサイトの住所:www.npmjs.com/advisories/…]
図中のHackerOneReportアドレス:hackerone.com/reports/310…
原型汚染だったのか.npmのウェブサイトでは、「defaultsDeep」、「merge」、「mergeWith」の3つの関数が使用中にプロトタイプ汚染をもたらす可能性があることが明らかになった.

Why


試してみる:
ES 6 assignを使用して実装:
やはり問題があります.

How


関連パッチcommit:github.com/lodash/loda…
コアコード:
結論:safeGetの関数を実現し,プロトタイプ上の値の取得を回避した.

関連知識点

  • npm audit docs.npmjs.com/cli/audit
  • proto vs prototype: github.com/creeperyang…

  • ベストプラクティス

  • forの使用をできるだけ避ける...in... オブジェクトを巡回する
  • オブジェクトを巡回する際にObjectを先に使用する.keys()オブジェクトのすべてのkeyを取得し、
  • を巡回する
  • 未知の変数を直接オブジェクトとするkeyは
  • を使用しないでください.
  • オブジェクトの未知の属性を読み込む場合は、必ずhasOwnPropertyで判断してから
  • を読み込む.
    転載先:https://juejin.im/post/5c30abae51882525ec2000e9