MASTG-TEST-0034: 测试对象持久性
此测试即将更新
此测试目前可使用,但将作为新的 OWASP MASTG v2 指南 的一部分进行全面修订。
请提交PR来帮助我们完成:MASTG v1->v2 MASTG-TEST-0034:测试对象持久性 (android)
概述¶
要测试设备上是否使用对象持久性来存储敏感信息,首先识别对象序列化的所有实例,并检查它们是否携带任何敏感数据。 如果是,请检查它是否受到适当的保护,以防止窃听或未经授权的修改。
以下是一些通用的补救步骤,您可以随时采取
- 确保敏感数据在序列化/持久化后已加密并进行了HMAC/签名。 在使用数据之前评估签名或HMAC。 有关更多详细信息,请参见“Android加密API”章节。
- 确保步骤1中使用的密钥不容易提取。 用户和/或应用程序实例应经过适当的身份验证/授权才能获取密钥。 有关更多详细信息,请参见“Android上的数据存储”章节。
- 确保在主动使用反序列化对象中的数据之前,对其进行仔细验证(例如,没有对业务/应用程序逻辑的利用)。
对于专注于高可用性的高风险应用程序,我们建议仅在序列化类稳定时才使用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
条目,其值如DATABASE
,VERSION
,QUERY_LOG
和DOMAIN_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权限,加密)时验证适当的附加安全控制。
动态分析¶
有几种方法可以执行动态分析
- 对于实际的持久性:使用数据存储章节中描述的技术。
- 对于基于反射的方法:使用 Android的Frida 钩入反序列化方法,或将无法处理的信息添加到序列化对象,以查看它们的处理方式(例如,应用程序是否崩溃,或者是否可以通过丰富对象来提取额外的信息)。