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

Хранение чувствительной информации в Binary Cookies

Критичность: ИНФО
Способ обнаружения: DAST, ФАЙЛЫ ПРИЛОЖЕНИЯ

Описание

Приложение не отключает хранение значений Cookies при работе с WebView.

При использовании WebView (это касается как устаревшего UIWebView, так и WKWebView) необходимо помнить, что значения Cookies, полученные при посещении сайта, сохраняются локально в файле специального формата Cookies.binarycookies. При этом в данных значениях могут быть и чувствительные данные, к примеру, сессионные идентификаторы или токены для доступа к сервису.

UIWebView устарел

Компонент UIWebView объявлен устаревшим (deprecated) начиная с iOS 12, а с декабря 2020 года Apple не принимает в App Store приложения, использующие UIWebView. Для отображения веб-контента следует использовать WKWebView: помимо актуального статуса, он работает в отдельном процессе и предоставляет более гибкое управление хранилищем данных (включая Cookies) через WKWebsiteDataStore.

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

При правильном использовании необходимо ограничивать хранение Cookie временем, в которое они используются. Обычно при закрытии WebView эти данные больше не нужны. А лучше всего отключить использование Cookie вообще.

Как пример, можно отключить хранение:

import UIKit
import WebKit
class ViewController: UIViewController, WKUIDelegate {
    var webView: WKWebView!
    override func loadView() {
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
        webView.uiDelegate = self
        view = webView
    }
    override func viewDidLoad() {
        super.viewDidLoad()
        let myURL = URL(string: "http://example.com")
        var myRequest = URLRequest(url: myURL!)
        myRequest.httpShouldHandleCookies = false
        webView.load(myRequest)
    }
}

Для удаления значений Cookie из общего хранилища системы загрузки URL (например, при логауте из приложения или его закрытии/открытии):

let storage = HTTPCookieStorage.shared
if let cookies = storage.cookies {
    for cookie in cookies {
        storage.deleteCookie(cookie)
    }
}

WKWebView хранит данные в собственном изолированном хранилище WKWebsiteDataStore, не связанном с HTTPCookieStorage.shared. Поэтому Cookies и другие данные веб-контента нужно очищать именно через него:

let dataStore = WKWebsiteDataStore.default()
let types: Set<String> = [WKWebsiteDataTypeCookies]
dataStore.removeData(ofTypes: types, modifiedSince: .distantPast) {
    // данные веб-контента удалены
}

Если веб-данные не должны сохраняться между сессиями вовсе, используйте непостоянное хранилище WKWebsiteDataStore.nonPersistent() при создании WKWebViewConfiguration.

Ссылки

  1. https://book.hacktricks.xyz/mobile-apps-pentesting/ios-pentesting#cookies
  2. https://developer.apple.com/forums/thread/81874
К началу