上文讲解了程序执行时污点传播方法。当然还需要讲解程序间或程序内部通过通信可能的污点传播。仍然以整数数据为例。
由安卓的体系结构可知,所有应用内与应用间通信都是通过binder实现,而关键部分总是写入数据包parcel当中的,这部分内容需要对binder比较熟悉,请自行补充。
当通信内容中包含整数型时,系统提供方法nativeWriteInt就可以将数据写入。但此时将丢失污点信息,因此在该过程中需要添加污点传播代码。其源码如下:
public final void writeInt(int val) {
// begin WITH_TAINT_TRACKING && WITH_TAINT_BYTE_PARCEL
int start = dataPosition();
nativeWriteInt(mNativePtr, val);
int end = dataPosition();
int len = end - start;
int tag = Taint.getTaintInt(val);
//String tstr = "0x" + Integer.toHexString(tag);
//if (tag != 0) Log.w("ParcelJava", "writeInt("+val+") tag = " + tstr + "\n");
//updateTaint(tag);
updateTaint(tag, start, len);
// end WITH_TAINT_TRACKING && WITH_TAINT_BYTE_PARCEL
}
就这样,当数据写入时将污点一并写入,同时在通信对方接收时一并将污点信息提取并标记到所读取的数据污点位。