При эксплуатации системы GitLab CE на своем предприятии (имеющему большую филиальную структуру), была обнаружена уязвимость, которая может привести к получению полного доступа к аккаунту любого пользователя системы администраторами филиалов предприятия.
Проблема выявлена в подсистеме LDAP-аутентификации пользователей. Дело в том, что основной сущностью, с использованием которой происходит авторизация в GitLab является E-Mail пользователя. Однако при входе пользователей в GitLab с использованием LDAP процесс аутентификации/авторизации происходит следующим образом:
- Пользователь вводит на странице Sign-In системы свои имя/пароль из службы каталогов LDAP (Active Directory).
- GitLab, используя введенные данные аккаунта производит аутентификацию пользователя в LDAP.
- В случае успешной аутентификации GitLab считывает из атрибута MAIL аутентифицированного аккаунта адрес электронной почты и авторизует по нему в GitLab без всяких дополнительных проверок
.
В результате, например, «нехороший» системный администратор «филиала A», может используя свои полномочия, к примеру в Active Directory, создать в своем OU «Филиал А» любого пользователя (например hackuser) и записать в его LDAP-атрибут MAIL адрес электронной почты пользователя любого другого филиала, на который даже не распространяются полномочия этого администратора. После этого «нехороший» администратор «Филиала А» может авторизоваться пользователем hackuser в системе GitLab, при этом в результате авторизации будет получен полный доступ к аккаунту пользователя, имеющего адрес электронной почты установленный «нехорошим» администратором для hackuser.
Таким образом, любой администратор, имеющий возможность изменять у пользователей информационное поле MAIL в службе каталогов, может получать доступ к любому аккаунту системы GitLab, не являясь администратором и даже пользователем этой системы.
О данной уязвимости было сообщено в команду разработки GitLab CE ( gitlab.com/gitlab-org/gitlab-ce/issues/3741 ), однако в работу указанная проблема не была принята, поскольку такое поведение системы является для разработчиков ожидаемым, нормальным и описано в документации на нее ( doc.gitlab.com/ce/integration/ldap.html#security, doc.gitlab.com/ce/integration/ldap.html#enabling-ldap-sign-in-for-existing-gitlab-users ).
Для нас использование такого варианта авторизации с применением LDAP являлось неприемлемым, поэтому был разработан небольшой патч, устраняющий указанную проблему. Суть патча состоит в дополнительной проверке соответствия полей username авторизующегося пользователя в GitLab и LDAP.
Патч для файла: /opt/gitlab/embedded/service/gitlab-rails/lib/gitlab/ldap/user.rb:
--- user.rb.orig 2016-01-18 12:00:42.315349492 +0300
+++ user.rb 2016-01-18 12:01:30.957432818 +0300
@@ -35,7 +35,7 @@
end
def find_by_email
- ::User.find_by(email: auth_hash.email.downcase)
+ ::User.find_by(email: auth_hash.email.downcase, username: auth_hash.username)
end
def update_user_attributes
Автор: mitshel