
CVE-2024-55215
Jrohy/trojan هو مشروع مفتوح المصدر مبني على Go لنشر خدمة Trojan تلقائيًا. واجهة التهيئة /auth/register الخاصة بالويب لم يتم إغلاقها بشكل صحيح بعد تكوين المستخدم، مما يسمح للمتطفلين غير المصرح لهم بتعديل كلمة مرور المسؤول مباشرة.
رابط المشروع:
الإصدارات المتأثرة:
تسجيل المسار، باستخدام الدالة updateUser لمعالجة طلب /auth/register
// https://github.com/Jrohy/trojan/tree/v2.15.3/web/auth.go#L155
func Auth(r *gin.Engine, timeout int) *jwt.GinJWTMiddleware {
jwtInit(timeout)
newInstall := gin.H{"code": 201, "message": "No administrator account found inside the database", "data": nil}
r.NoRoute(authMiddleware.MiddlewareFunc(), func(c *gin.Context) {
claims := jwt.ExtractClaims(c)
fmt.Printf("NoRoute claims: %#v\n", claims)
c.JSON(404, gin.H{"code": 404, "message": "Page not found"})
})
...
r.POST("/auth/register", updateUser)
استخراج password من الطلب، تمريره إلى SetValue
// https://github.com/Jrohy/trojan/tree/v2.15.3/web/auth.go#L113
func updateUser(c *gin.Context) {
responseBody := controller.ResponseBody{Msg: "success"}
defer controller.TimeCost(time.Now(), &responseBody)
username := c.DefaultPostForm("username", "admin")
pass := c.PostForm("password")
err := core.SetValue(fmt.Sprintf("%s_pass", username), pass)
if err != nil {
responseBody.Msg = err.Error()
}
c.JSON(200, responseBody)
}
تحديث قاعدة البيانات، كتابة كلمة المرور الجديدة
// https://github.com/Jrohy/trojan/tree/v2.15.3/core/leveldb.go#L30
func SetValue(key string, value string) error {
db, err := leveldb.OpenFile(dbPath, nil)
if err != nil {
return err
}
defer db.Close()
return db.Put([]byte(key), []byte(value), nil)
}
