theoremoon / ShellgeiBot

シェル芸を実行しちゃう危険なbot
Apache License 2.0
170 stars 15 forks source link

Mitigate infinite recursion #40

Closed Ry0taK closed 5 years ago

Ry0taK commented 5 years ago

要約

tweet.goにおいて、2つ以上のツイートを再帰的に引用した場合の判定が行われていなかったため、無限ループを起こせた問題の修正。

説明

自身を参照する再帰的ツイートは、tweet.goの34行目から36行目で処理しないように設計されていますが、2つ以上のツイートを再帰的に繋げた場合(1つ目のツイートで2つ目のツイートIDを当て、2つ目のツイートで1つ目のツイートを参照した場合)はこの制限を回避することが出来ます(...多分)。 時間と運を要するため、PoCは作成していませんが、(多分)実際に攻撃可能(だと思うけど自信がない)です。(ちなみにPoCが出来ていないためコードのテストもしてません。) これによる攻撃が発生した場合、Botの応答が停止したりはしませんが(main.goの115行目にて非同期になっているため)、何度も繰り返すことによりリソースを過度に消費させることが可能(かもしれないけどわからない)です。

theoremoon commented 5 years ago

@Ry0taK Pull Reqありがとうございます。これは以前から認知されている脆弱性なので(※参照: https://twitter.com/theoldmoon0602/status/1143693408294227968 ) 修正するにやぶさかではないですが、この方法だとシェル芸リバーシ (https://twitter.com/minyoruminyon/status/1154459096193437696 ) のようなユースケースが潰れてしまうのでだめですね……。というわけでかつて実行したシェル芸のURLのか何かのsetを持っておくことになると思うんですが、面倒なので放置していました。そちらの実装にしてくれたらマージしようと思いますし、面倒であればこのまま放置でも問題ないです(一回やってもらうのも面白いと思っているので)

Ry0taK commented 5 years ago

こんな感じでどうでしょうか...?

Ry0taK commented 5 years ago

こうしないと一番最初のシェル芸が2回実行されるので修正