UserScriptを他人のprojectから読み込むな
takker.iconもそうですが、自分のprojectにコピペするのをめんどくさがって他人のprojectから直接importしちゃう人、いませんか?
今すぐやめましょう。今すぐです!!!
Just Do Itおじさん.icon
どうして危ないのか
projectの削除やowner権限の譲渡、private pageの外部送信など、超絶危険なScriptを確認メッセージなしに実行させることができてしまう
対策
他人のprojectからUserScriptを絶対にimportしない
代わりに自分だけが編集できる個人ProjectにUserScriptを置いて、そこからimportする 友人などが編集できるprojectでもいいですか?bsahd.icon
UserScriptが更新されたら、まず自分のページを見に行く https://gyazo.com/e26184d72514152f8a34bc36eb023361
Load new UserScriptを押すのはその後
yuki_minoh.icon
整理すると
可読形式でない(bundle, minifyされている)場合
importしてはいけません
可読形式の場合
第三者がコードを書き込むことを防ぐため、安全な場所にコピペしてから読み込みましょう
コードは目を通しておきましょう
という感じかな?
過去ログ
yuki_minoh.icon
個人的には、ちょっと極端な反応かなとは思います
yuki_minoh.iconも似たようなことを過去にやりましたがw
より安全性の高くて利便性を保つ方法を実践しようぜ、みたいな方向性には大賛成です
信頼できる人しか入れないprojectなら極端かもしれないyosider.icon
招待リンクが公開されているprojectの場合は怖いyosider.icon
いや実際たしかにそうですよね。。。yuki_minoh.icon
他人にユーザーページ変更されて読み込まさせられたりするとやばいもんね普通に
でも結局なんかコピペでインストールするようになってもここは変わんない。。。?
どこがセキュリティの要点になってるのかちょっとつかめてないですyuki_minoh.icon
他者が編集できるprojectにあるUserScriptを読み込むところが問題になっていますtakker.icon
編集されても警告が出ないから
そういうことね、理解したyuki_minoh.icon
自分のページが直接書き換えれる場合は、警告が表示されるので、それを無視しない限り信頼できないコードが勝手に実行される事はありません
利便性と安全性のバランスの問題だと思っています
コピペしても、それだけだとバランスはあまり改善しない気はします
コピペしても、元のソースがバンドルしてあったりするとソースが読めないという問題がある
それはbundleされているのが問題ではなく、bundle前のソースが非公開になっているのが問題なのでは?takker.icon
bundle前のコードが隠されているケースはそうそうないでしょうから、考慮しなくていいと思います
まぁそれを言い始めると、「バンドル前後を偽っていない」という点でソースを信頼することになりますよねyuki_minoh.icon
安全なソースを提示しておいて危険なminified scriptを読み込ませるみたいなことはできてしまうので
どのくらい信頼するのかはコピペ前後であまり変わっていないのでは?
yuki minoh.iconさんは、bundle済みコードも含めて開発者側が提供することを前提に述べている
takker.iconは利用者が各自でbundleすることを前提に述べていた
お試し用に開発者側がbundle済みコードを添付するケースも含む
なるほどyuki_minoh.icon
利用者がbundleする場合は、元のソースコードを確認する済むので、bundleの偽造を疑う必要がありません
なお、bundlerに悪意のあるコードが混ざっている可能性は無視しています
webpackやesbuildにevilなコードが混ざったら、すぐ世界中のエンジニアが気づいて修正当てたり警告を出したりするだろう
まぁ規模の違いはあると思いますyuki_minoh.icon
利用者の母数が違いますし、なるべく可読なままで公開しよう、でベストプラクティスな気はする
読むのにもリテラシーと労力がが必要ですし
まあその通りなんですが、そこで立ち止まりたくないなぁってお気持ちですyuki_minoh.icon
似た状況は人類は複数回経験してるはず(知見がたまっているはず)なので
わかるyosider.icontakker.icon
僕たちがプログラミングするときに、他人の関与もろもろの中でコーディングをしているのは今にはじまったことではありませんし
なので、既存の手法ではどのように脆弱性などが管理されているのかをこの機会にまとめてみたいですね
へーこんな仕組みがyuki_minoh.icon
これScrapbox上で実装できそうですよね、ある程度
脆弱性報告の簡便な仕組みとかもほしい
ってかなんなら一緒につくりません???w
更新があったときに、どのモジュールにどういうdiffがあったのかとか理解したいし、そのためにも、バンドルしない形式でimportしても利便性を損なわないようにいろいろ揃えたい
たとえば、プロジェクトに移動したら毎回Managerを初期化し、importメソッドをコールする
Managerはbundle前ソースの更新履歴やハッシュを確認
更新があるとき
localStorageにminify & bundleしてキャッシュ
利用者にdiffを提示
更新がないとき
localStorageのminified scriptを読み込む
/icons/ほしい.iconyosider.iconyuki_minoh.icon
miyamonz.iconは、全然極端じゃない、妥当な判断だと思います
外のプロジェクトからimportするのは、以下の可能性を将来的に常に把握しないとinjectionが発生します
対象のプロジェクトのメンバーが増える
対象のプロジェクトのメンバーが追加した別のメンバーが別のメンバーを追加する
...
今よくても、将来どうなってるかは未来なので分からない
対象のプロジェクトのメンバーが不正アクセスに合う
対象のプロジェクトのメンバーがevilになってしまう
そもそもevilでない保証はどこにもない
知り合いだろうとなんだろうと
自分がどこからimportしてるのか把握するのは難しい
diff判定ほしいですねmiyamonz.icon
公式が出してほしくはある
わかるyuki_minoh.icon
ださなそうだなぁとは思ってますけどね
他人が人のUserScriptいじったときにどうなるのか知りたいmiyamonz.icon
たぶんいままで起きたこと無いから分からない
もしかしてすでにそこの防御機能あったりして
たぶんないと思いますtakker.icon
最初から絶対に、自分個人しかいないプロジェクトからしかimportしない、で徹底するのが一番ラクです
UserScriptコピペするときは、必ずすべてのソースコードを読むべきです
となるとbundleが難しい気がするんですが、どう思いますかyuki_minoh.icon
bundle前後の偽装とか
bundleはしない、で現状miyamonz.iconは我慢してます
全部読める範囲のことしかやらない、でとどめてます
自分のコードをgit管理して、scrapboxに埋め込むために自前でbundleするのは良いんじゃないでしょうか?miyamonz.icon
とてもありだと思っていますyuki_minoh.icon
全部読むべきなので、util的なスクリプトはimportとかモジュールで機能を分けるのではなく、単なる関数として書いて楽にコピペできるようにしたほうが、参考にする側には助かる
なるほどyuki_minoh.icon
TS化してるのでコピペで利用不能
importなしで単独で自立するようなutilコードを用意するのは現実的でない
似たようなコードを何度も書くことになる
保守が大変
多分コピペで管理できる程度の規模のコードを想定していると推測
Reference
UserScript.icon