Перейти к содержанию

Хранение sensitive-информации в кэше клавиатуры

Критичность: СРЕДНИЙ
Способ обнаружения: DAST, SENSITIVE INFO

Описание

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

Рекомендации

За включение или выключение опции автодополнения отвечает параметр autocorrectionType в поле объекта класса UITextField.

Пример кода:

UITextField *textField = [[UITextField alloc] initWithFrame:frame]; 
textField.autocorrectionType = UITextAutocorrectionTypeNo;

Все поля ввода чувствительной информации должны помечаться параметром secureTextEntry

Пример кода:

UITextField *textField = [[UITextField alloc] initWithFrame:frame]; 
textField.secureTextEntry = YES;

Рекомендуется использовать реализацию custom-клавиатуры для ввода все чувствительных данных с отключенным кэшированием всех вводимых данных. Также необходимо позаботиться о запрещении возможности копирования в буфер обмена введенной информации для доступа к нему из других приложений

Пример кода:

- (BOOL)canPerformAction:(SEL)action 
            withSender:(id)sender
{
UIMenuController *menuController = [UIMenuController sharedMenuController]; 
if (menuController) {
    menuController.menuVisible = NO;
}
return NO;
}

UIMenuController устарел

Класс UIMenuController объявлен устаревшим начиная с iOS 16. В новых приложениях для управления меню редактирования (включая запрет операций копирования/вставки в полях с чувствительными данными) следует использовать UIEditMenuInteraction, а сам набор действий ограничивать, переопределяя canPerformAction(_:withSender:) у UITextField/UITextView:

override func canPerformAction(_ action: Selector, withSender sender: Any?) -> Bool {
    if action == #selector(copy(_:)) || action == #selector(paste(_:)) || action == #selector(cut(_:)) {
        return false
    }
    return super.canPerformAction(action, withSender: sender)
}

При использовании UIEditMenuInteraction ограничить состав пунктов можно в методе делегата editMenuInteraction(_:menuFor:suggestedActions:), вернув отфильтрованное меню.

Ссылки

  1. https://developer.apple.com
  2. OWASP Mobile Top 10
  3. owasp-mstg/0x05d-Testing-Data-Storage.md at master · OWASP/owasp-mstg
  4. CWE—CWE-200: Exposure of Sensitive Information to an Unauthorized Actor (4.5)
  5. Custom keyboard
  6. Cache keyboard review
К началу