SSRF対応のgolangライブラリをつくった

SSRFそのものの解説は、最近公開されたはせがわようすけさんのスライドが詳しいので、そちらを見ていただくとして、、、

speakerdeck.com

最近では実際の攻撃事例もでてきている、ということで、ついカッとなってgolangのライブラリを作ってみました。

github.com

使い方は antissrf.Client()*http.Client が帰ってくるのでそれをフツーに使うだけというカンタン仕様です。
プライベートアドレスとかループバックアドレスとかリンクローカルアドレスにアクセスしようとするとerrorが帰ってきます。

var client = antissrf.Client()

func main() {
    // errが帰る
    _, err := client.Get("http://169.254.169.254/")
}

antissrf.Client()*net.IPNet を可変長引数で受け付けるので、他にブラックリストを追加したいケースにも対応可能です。

var client = antissrf.Client(
    antissrf.MustParseCIDR("192.0.2.0/24"),
    antissrf.MustParseCIDR("198.51.100.0/24"),
    antissrf.MustParseCIDR("203.0.113.0/24"))

名前解決のあとのtcpコネクションをはる直前のremoteのIPアドレスをチェックしているので、DNS Rebindingな攻撃にも安心です。

そんなわけで、ご活用ください。