跳过内容

MASTG-TEST-0034: 测试对象持久性

此测试即将更新

此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。

请提交PR来帮助我们完成:MASTG v1->v2 MASTG-TEST-0034:测试对象持久性 (android)

发送反馈

概述

要测试设备上是否使用对象持久性来存储敏感信息,首先识别对象序列化的所有实例,并检查它们是否携带任何敏感数据。 如果是,请检查它是否受到适当的保护,以防止窃听或未经授权的修改。

以下是一些通用的补救步骤,您可以随时采取

  1. 确保敏感数据在序列化/持久化后已加密并进行了HMAC/签名。 在使用数据之前评估签名或HMAC。 有关更多详细信息,请参见“Android加密API”章节。
  2. 确保步骤1中使用的密钥不容易提取。 用户和/或应用程序实例应经过适当的身份验证/授权才能获取密钥。 有关更多详细信息,请参见“Android上的数据存储”章节。
  3. 确保在主动使用反序列化对象中的数据之前,对其进行仔细验证(例如,没有对业务/应用程序逻辑的利用)。

对于专注于高可用性的高风险应用程序,我们建议仅在序列化类稳定时才使用Serializable。 其次,我们建议不要使用基于反射的持久性,因为

  • 攻击者可以通过基于字符串的参数找到该方法的签名
  • 攻击者可能能够操纵基于反射的步骤来执行业务逻辑。

静态分析

对象序列化

在源代码中搜索以下关键字

  • import java.io.Serializable
  • implements Serializable

JSON

如果您需要防止内存转储,请确保非常敏感的信息不会以JSON格式存储,因为您无法保证使用标准库来防止反内存转储技术。 您可以在相应的库中检查以下关键字

JSONObject 在源代码中搜索以下关键字

  • import org.json.JSONObject;
  • import org.json.JSONArray;

GSON 在源代码中搜索以下关键字

  • import com.google.gson
  • import com.google.gson.annotations
  • import com.google.gson.reflect
  • import com.google.gson.stream
  • new Gson();
  • 诸如@Expose@JsonAdapter@SerializedName@Since@Until之类的注释

Jackson 在源代码中搜索以下关键字

  • import com.fasterxml.jackson.core
  • import org.codehaus.jackson用于旧版本。

ORM

使用ORM库时,请确保数据存储在加密的数据库中,并且类表示在存储之前已单独加密。 有关更多详细信息,请参见“Android上的数据存储”和“Android加密API”章节。 您可以在相应的库中检查以下关键字

OrmLite 在源代码中搜索以下关键字

  • import com.j256.*
  • import com.j256.dao
  • import com.j256.db
  • import com.j256.stmt
  • import com.j256.table\

请确保已禁用日志记录。

SugarORM 在源代码中搜索以下关键字

  • import com.github.satyan
  • extends SugarRecord<Type>
  • 在AndroidManifest中,将存在meta-data条目,其值如DATABASEVERSIONQUERY_LOGDOMAIN_PACKAGE_NAME

确保将QUERY_LOG设置为false。

GreenDAO 在源代码中搜索以下关键字

  • import org.greenrobot.greendao.annotation.Convert
  • import org.greenrobot.greendao.annotation.Entity
  • import org.greenrobot.greendao.annotation.Generated
  • import org.greenrobot.greendao.annotation.Id
  • import org.greenrobot.greendao.annotation.Index
  • import org.greenrobot.greendao.annotation.NotNull
  • import org.greenrobot.greendao.annotation.*
  • import org.greenrobot.greendao.database.Database
  • import org.greenrobot.greendao.query.Query

ActiveAndroid 在源代码中搜索以下关键字

  • ActiveAndroid.initialize(<contextReference>);
  • import com.activeandroid.Configuration
  • import com.activeandroid.query.*

Realm 在源代码中搜索以下关键字

  • import io.realm.RealmObject;
  • import io.realm.annotations.PrimaryKey;

Parcelable

确保通过包含Parcelable的Bundle将敏感信息存储在Intent中时,采取适当的安全措施。 使用显式Intent,并在使用应用程序级IPC(例如,签名验证,intent权限,加密)时验证适当的附加安全控制。

动态分析

有几种方法可以执行动态分析

  1. 对于实际的持久性:使用数据存储章节中描述的技术。
  2. 对于基于反射的方法:使用 Android的Frida 钩入反序列化方法,或将无法处理的信息添加到序列化对象,以查看它们的处理方式(例如,应用程序是否崩溃,或者是否可以通过丰富对象来提取额外的信息)。