CVE-2017-12850
프로젝트 관리를 위해 사용하는 KanBoard에서 다른 사용자의 비밀번호를 변경할 수 있는 취약점(CVE-2017-12850)이 발생하였다.
KanBoard Github의 Commit에서 두 개 파일을 수정한 것을 확인할 수 있다.
- app/Controller/UserCredentialController.php
list($valid, $errors) = $this->userValidator->validatePasswordModification($values);
+ if (! $this->userSession->isAdmin()) {
+ $values['id'] = $this->userSession->getId();
+ }
+
if ($valid) {
if ($this->userModel->update($values)) {
$this->flash->success(t('Password modified successfully.'));
먼저 UserCredentialController.php 파일에 추가된 소스코드를 살펴보자. if 문을 이용하여 관리자 계정 유무를 확인하고 관리자 계정이 아닐 경우 유저 인증 값에서 ID 값을 추출하여 $values[‘id’] 값에 넣는 것을 확인할 수 있다. 관리자 계정이 아닐 경우, 비밀번호 변경을 요청 세션 값에서 ID를 추출하여 변경하게 함으로 다른 사용자의 비밀번호를 무단으로 변경하지 못하게 막았을 것이라 추측해볼 수 있다.
- app/Validator/UserValidator.php
$v = new Validator($values, array_merge($rules, $this->commonPasswordValidationRules()));
if ($v->execute()) {
+ if (! $this->userSession->isAdmin() && $values['id'] != $this->userSession->getId()) {
+ return array(false, array('current_password' => array('Invalid User ID')));
+ }
+
if ($this->authenticationManager->passwordAuthentication($this->userSession->getUsername(), $values['current_password'], false)) {
return array(true, array());
} else {
UserValidator.php 에서 추가된 소스코드를 살펴보면, if문을 이용하여 관리자 계정이 아닐 경우와 $values[‘id’] 값과 세션 값에서 추출한 ID 값이 다를 경우에 오류 구문을 반환하여 비밀번호 변경을 막는 것을 확인할 수 있다.