Skip to content

Commit 6b9e5db

Browse files
committed
fix: disable SetPassword DBus method and prevent chpasswd injection
1. SetPassword now returns error directly, marking the DBus method as deprecated and no longer supported 2. ModifyPasswd rejects password hashes containing \n\r: to prevent chpasswd stdin injection fix: 禁用 SetPassword DBus 方法并防止 chpasswd 注入 1. SetPassword 直接返回错误,标记该 DBus 方法为已废弃 2. ModifyPasswd 拒绝包含 \n\r: 的密码哈希, 防止通过 chpasswd stdin 注入额外记录
1 parent 65548c9 commit 6b9e5db

2 files changed

Lines changed: 5 additions & 49 deletions

File tree

accounts1/user_ifc.go

Lines changed: 1 addition & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -116,55 +116,7 @@ func (u *User) SetShell(sender dbus.Sender, shell string) *dbus.Error {
116116
}
117117

118118
func (u *User) SetPassword(sender dbus.Sender, password string) *dbus.Error {
119-
logger.Debug("[SetPassword] start ...")
120-
121-
// set password from UnionID
122-
if password == "" {
123-
return nil
124-
}
125-
126-
err := u.checkAuth(sender, false, "")
127-
if err != nil {
128-
logger.Debug("[SetPassword] access denied:", err)
129-
return dbusutil.ToError(err)
130-
}
131-
132-
var count = 10
133-
for {
134-
_, err := users.GetShadowInfo(u.UserName)
135-
136-
if err == nil {
137-
break
138-
}
139-
count--
140-
if count == 0 {
141-
return dbusutil.ToError(err)
142-
}
143-
time.Sleep(time.Second)
144-
}
145-
146-
if err := users.ModifyPasswd(password, u.UserName); err != nil {
147-
logger.Warning("DoAction: modify password failed:", err)
148-
return dbusutil.ToError(err)
149-
}
150-
151-
err = removeLoginKeyring(u)
152-
if err != nil {
153-
logger.Warningf("DoAction: remove login keyring failed: %v", err)
154-
}
155-
156-
u.PropsMu.Lock()
157-
defer u.PropsMu.Unlock()
158-
159-
if u.Locked {
160-
if err := users.LockedUser(false, u.UserName); err != nil {
161-
logger.Warning("DoAction: unlock user failed:", err)
162-
return dbusutil.ToError(err)
163-
}
164-
u.Locked = false
165-
_ = u.emitPropChangedLocked(false)
166-
}
167-
return nil
119+
return dbusutil.ToError(fmt.Errorf("SetPassword is deprecated and no longer supported"))
168120
}
169121

170122
func (u *User) SetMaxPasswordAge(sender dbus.Sender, nDays int32) *dbus.Error {

accounts1/users/prop.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ func ModifyPasswd(words, username string) error {
161161
if len(words) == 0 {
162162
return errInvalidParam
163163
}
164+
// 防止命令注入
165+
if strings.ContainsAny(words, "\n\r") {
166+
return errInvalidParam
167+
}
164168

165169
cmd := exec.Command(pwdCmdModify, "-e")
166170
input := fmt.Sprintf("%s:%s\n", username, words)

0 commit comments

Comments
 (0)