【问题标题】:prevent Android DownloadManager from downloading for restricted apps阻止 Android DownloadManager 为受限应用下载
【发布时间】:2018-10-24 15:42:45
【问题描述】:

我想阻止 DownloadManager 为 NetworkPolicyManager 禁止访问互联网的应用下载文件。我使用的自定义 ROM 通过将这样的条目写入 iptables 来强制执行此操作:

-A INPUT -i <interface> -m owner --uid-owner <UID> -j REJECT --reject-with icmp-port-unreachable

DownloadManager 是在他自己的 UID 下启动的,因此可以为无法访问 Internet 的应用程序下载文件。如果我也限制了 DownloadManager,其他应该能够访问 Internet 的应用程序无法通过 DownloadManager 下载文件作为附带损害。我的(长期)目标是通过关闭这个(安全)漏洞来为这个自定义 ROM 做出贡献。

我看了source code of DownloadManager,不明白enqueue方法中实际下载从哪里开始。在这个方法之后执行什么代码?我在其他方法中也找不到任何线索。

public long enqueue(Request request) {
    ContentValues values = request.toContentValues(mPackageName);
    Uri downloadUri = mResolver.insert(Downloads.Impl.CONTENT_URI, values);
    long id = Long.parseLong(downloadUri.getLastPathSegment());
    return id;
}

最后,我想修改 DownloadManager,使受限制应用排队的下载得到相应的状态设置,并在不使客户端应用(尝试开始下载的应用)崩溃的情况下停止。

COLUMN_STATUS = STATUS_FAILED = 1 << 4 = 16
COLUMN_REASON = ERROR_UNKNOWN = 1000 or ERROR_BLOCKED = 1010

但如果我不明白发生了什么,我就无法做到这一点。请帮助我理解代码或提示我正确的方向。

【问题讨论】:

  • "这个方法之后会执行什么代码?" ——没有,直接。实际下载由a separate app执行。

标签: java android


【解决方案1】:

经过一些研究并在 CommonsWares 的帮助下,我找到了 DownloadThread.java 执行实际下载的位置。由于这篇文章可能不会得到更好的答案,我现在会尽我所能回答这个问题:检查请求实体是否有权在

的帮助下下载
NetworkPolicyManager.getUidPolicy(int uid)

可能会完成这项工作。但这需要具有保护级别签名的 android.permission.MANAGE_NETWORK_POLICY。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 2015-05-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多