我可以毫无问题地调用其他应用程序的活动,包括向他们发送一些数据并接收一些数据。但是我发送和接收一些敏感信息,如果在错误的手中可能会被滥用。我的问题是,在应用程序之间旅行时这个数据是否安全?
例如,我调用这样的活动:
Intent intent = new Intent("com.my.package.MY_REQUEST_ACTION");
intent.setClassName("com.other.package", "com.other.package.UserActionActivity");
signerIntent.putExtra("INTENT_PASSWORD", "1234");
signerIntent.putExtra("INTENT_COMMAND", "COMMAND_DO_SOMETHING");
signerIntent.setType("text/plain");
startActivityForResult(intent, 0);
并在UserActionActivity中返回一些内容:
Intent result = new Intent("com.other.package.INTENT_RESULT_DESCRIPTION");
result.putExtra("INTENT_RETURN_RESULT", "...");
result.putExtra("INTENT_RETURN_RESULT2", "...");
setResult(Activity.RESULT_OK, result);
finish();
等等。但这些额外的字符串有多安全?我是否必须担心其他应用程序(除了涉及的两个应用程序)可以访问它们,无论是有意还是通过某种“黑客”?我需要像公钥加密这样的东西吗?
根源系统的情况有所不同(即具有root权限的应用程序可以轻松读取应用程序间通信)?
答案 0 :(得分:1)
我是否必须担心其他应用程序(除了涉及的两个应用程序)可以访问它们,无论是有意还是通过某种“黑客”?
我们暂时假设这两个应用都没有被攻击者修改过。
如果是这样,那么原则上,您建立的通信应该在非root设备上是私有的。在实践中,有一些活动Intent
附加的错误,虽然我最近都不知道。在您的IPC选项中,从安全角度来看,活动可能是最糟糕的选择,因为它们具有其他影响(例如,出现在概述/最近任务屏幕中),这增加了我们忽略的某些错误的可能性。
但是,在您的代码中,双方都认为其他应用尚未修改。特别是:
除非您有一些未显示的安全性,否则设备上的任何应用都可以在您的第一个代码段中运行代码并尝试欺骗应用以在第二个代码段中返回响应。
您的第一个代码段中的代码假定攻击者未修改com.other.package
。
有很多方法可以帮助防范这种情况(例如,自定义signature
权限,在运行时检查签名)。
另外,请记住,攻击者可以毫不费力地找到"1234"
。
关于建议加密的评论,鉴于您所描述的协议,加密似乎是一种不太可能的解决方案。如果您必须在IPC协议中提供秘密(INTENT_PASSWORD
),那么两个应用程序都不必使用加密目的的共享秘密,我不太确定您将使用哪种公钥基础结构来提供公钥加密。
根源系统的情况有所不同(即具有root权限的应用程序可以轻松读取应用程序间通信)?
绝对。在有根设备上,所有投注均已关闭。但这并不是专门针对IPC的。
答案 1 :(得分:0)
简短回答:它不安全,但攻击者需要付出一些努力。
答案很长: 转移可以被中间人攻击中的人拦截:
在无根电话上:
如果您将数据发送到intent.setClassName("com.other.package", "com.other.package.UserActionActivity");
,则可以卸载原始的“com.other.package”并安装他自己的“com.other.package”,其活动与接收未加密的数据相同。
例如,攻击者可以反汇编原始软件,添加代码(对秘密数据执行某些操作)并将代码重新组合到新的apk(使用不同的证书)
在root设备上:我不知道但我认为“暴露框架”有可能拦截并重新定义android os调用。