Skip to main content

V2.1.6 Password Security

Requirement:#

Verify that password change functionality requires the user's current and new password.

Explanation:#

1 Authentication Verification: Требование ввести текущий пароль пользователя в процессе смены пароля служит дополнительной формой аутентификации. Это гарантирует, что сменить пароль может только законный владелец учетной записи, которому известен текущий пароль. Без такой проверки злоумышленник, получивший доступ к сеансу входа в систему (например, в результате session hijacking  или XSS-атаки), может изменить пароль пользователя без его ведома.

2 Prevent Unauthorized Changes: Указывая текущий пароль, приложение предотвращает несанкционированное изменение пароля пользователя. Без этого требования злоумышленник, имеющий временный доступ к устройству пользователя (например, к незаблокированному телефону или компьютеру), может изменить пароль без его согласия.

3 Protect User Privacy: Требование ввода текущего пароля гарантирует, что пользователи имеют контроль над своими учетными записями и знают о любых изменениях. Это обеспечивает конфиденциальность и предотвращает попытки злоумышленников изменить данные учетной записи без их ведома.

4 Security Best Practice: Требование вводить текущий и новый пароли является передовым методом обеспечения безопасности, широко рекомендуемым стандартами и системами безопасности. Она повышает общую безопасность процесса смены пароля и снижает риск потенциальных нарушений безопасности.

Для выполнения этого требования в вашем приложении должно быть реализовано следующее:

1 User Authentication:

  •  Убедитесь, что пользователи должны войти в свои учетные записи, прежде чем пытаться сменить пароль. Функция смены пароля должна быть доступна только аутентифицированным пользователям.

2 Current Password Verification:

  • В процессе смены пароля следует предложить пользователю ввести текущий пароль, чтобы подтвердить его личность и право на внесение изменений.

3 New Password Entry:

  • Предложите пользователю ввести новый пароль и убедитесь, что он соответствует требуемым критериям сложности (например, минимальная длина, требования к количеству символов).

4 Password Confirmation:

  • Запросите у пользователя подтверждение нового пароля, введя его дважды, чтобы избежать ошибок при наборе.

5 Backend Validation:

  • Выполнение проверки на стороне сервера для подтверждения корректности и безопасности текущего и нового паролей перед изменением пароля.

6 Session Handling:

  • После успешной смены пароля аннулировать все активные сессии, связанные со старым паролем, для предотвращения несанкционированного доступа.

7 User Notifications:

  • При необходимости следует уведомлять пользователей по электронной почте или другим способом о смене пароля, чтобы предупредить их о подозрительных действиях.

Remediation:#

1 User Authentication:

  • Убедитесь, что пользователи должны войти в свои учетные записи, прежде чем получить доступ к функции смены пароля. Убедитесь, что пользователи проходят аутентификацию с использованием надлежащего управления сессиями или аутентификации на основе токенов.

2 Implement Password Change Flow:

  • Создайте процесс смены пароля, который предложит пользователю ввести текущий пароль, а затем указать новый пароль.

3 Current Password Verification:

  • В процессе смены пароля проверьте текущий пароль пользователя, чтобы подтвердить его идентификацию и авторизацию. Сравните введенный текущий пароль с паролем, хранящимся в базе данных пользователей.

4 Password Complexity:

  • Обеспечьте соблюдение требований к сложности пароля для нового пароля, как и при первичной регистрации. Убедитесь, что новый пароль соответствует необходимым критериям безопасности (например, минимальная длина, заглавные и строчные буквы, цифры, специальные символы).

5 Password Confirmation:

  • Попросите пользователя ввести новый пароль дважды (подтверждение пароля), чтобы избежать опечаток и убедиться в правильности введенного пароля.

6 Backend Validation:

  • Выполните проверку текущего и нового паролей на стороне сервера, чтобы предотвратить любые манипуляции на стороне клиента. Убедитесь, что пароли соответствуют требуемым критериям и введены правильно, прежде чем приступать к их изменению.

7 Session Handling:

  • После успешной смены пароля аннулируйте все активные сессии, связанные со старым паролем, для защиты от несанкционированного доступа.

8 User Notifications (Optional):

  • Опционально, при смене пароля следует уведомлять пользователей по электронной почте или другим способом, чтобы предупредить их о возможных несанкционированных изменениях.

9 Testing:

  • Проведите всестороннее тестирование, чтобы убедиться в том, что функция смены пароля работает должным образом. Протестируйте различные сценарии, включая корректную смену пароля, неправильный ввод текущего пароля и проверку сложности пароля.

10 Security Testing:

  • Провести тестирование безопасности, включая тестирование на проникновение, с целью выявления и устранения уязвимостей, связанных с функцией смены пароля.

11 User Education:

  • Предоставить пользователям четкие инструкции по правильному использованию функции смены пароля. Проинформировать пользователей о важности обеспечения безопасности текущего пароля и о пользе периодической смены паролей.

12 Review Codebase:

  • Проведите анализ кода на предмет соответствия функциональности смены пароля требованию.

Пример кода Python для реализации функции смены пароля в вашем приложении в соответствии с требованием OWASP:

Пример кода Python для реализации функции смены пароля
import hashlib
# Simulated user database (replace with your actual user database)
users = {
"user1": {
"password": "5f4dcc3b5aa765d61d8327deb882cf99", # Password: "password"
"email": "user1@example.com"
}
}
# Function to hash the password (you should use a stronger hashing algorithm like bcrypt in a real application)
def hash_password(password):
return hashlib.md5(password.encode()).hexdigest()
# Function to validate the new password (replace with your password complexity checks)
def is_strong_password(password):
return len(password) >= 8
# Function to change user password
def change_password(username, current_password, new_password):
if username in users:
stored_password = users[username]["password"]
if hash_password(current_password) == stored_password:
if is_strong_password(new_password):
users[username]["password"] = hash_password(new_password)
return True
else:
print("New password does not meet complexity requirements.")
else:
print("Incorrect current password.")
else:
print("User not found.")
return False
# Example usage in your application
def main():
username = input("Enter your username: ")
current_password = input("Enter your current password: ")
new_password = input("Enter your new password: ")
confirm_new_password = input("Confirm your new password: ")
if new_password == confirm_new_password:
if change_password(username, current_password, new_password):
print("Password changed successfully!")
else:
print("Password change failed. Please try again.")
else:
print("New passwords do not match. Please try again.")
if __name__ == "__main__":
main()

В данном примере код:

  • Словарь users имитирует базу данных пользователей. Каждый пользователь имеет имя пользователя, хэшированный пароль и e-mail (для демонстрации).
  • Функция hash_password хэширует пароль. В данном примере для простоты мы используем MD5, но в реальном приложении следует использовать более сильный криптографический алгоритм, например bcrypt.
  • Функция is_strong_password проверяет, соответствует ли новый пароль требованиям сложности. В данном примере мы проверяем только минимальную длину пароля в 8 символов, но вы должны настроить эту функцию в соответствии с вашей политикой сложности паролей.
  • Функция change_password обрабатывает процесс смены пароля. Она проверяет текущий пароль пользователя, проверяет сложность нового пароля и, если все верно, обновляет сохраненный пароль.
  • Функция main демонстрирует процесс смены пароля, в котором пользователь вводит имя пользователя, текущий пароль, новый пароль и подтверждает новый пароль.

Обратите внимание, что это упрощенный пример. В реальных приложениях необходимо использовать соответствующую базу данных, применять более надежное хеширование паролей (например, bcrypt), более тщательную проверку сложности паролей, более изящно обрабатывать ошибки смены пароля (например, выдавать пользователям специальные сообщения об ошибках). Кроме того, для защиты конфиденциальных данных при передаче следует обеспечить безопасность процесса смены пароля с помощью протокола HTTPS.

Additional:#

https://cwe.mitre.org/data/definitions/620.html

https://pages.nist.gov/800-63-3/sp800-63b.html#appA