被操纵的 CAP 文件是否会在安装过程中损坏 Java 卡?
Does a manipulated CAP file can break a Java Card in the installation process?
我有一张 Java 卡可以正常工作:
GlobalPlatfomPro:: gp -list
AID: A000000003000000 (|........|)
ISD OP_READY: Security Domain, Card lock, Card terminate, Default selected,
CVM (PIN) management
我在接收到每个命令时将一个简单的程序写入 return APDU 缓冲区:
public class BArrayReturner extends Applet {
public static byte[] theArray={(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff};
public static short arrayLength=0;
private BArrayReturner() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new BArrayReturner().register();
BArrayReturner.arrayLength=(short)bArray.length;
Util.arrayCopyNonAtomic(bArray, (short)0,BArrayReturner.theArray , (short) 0, BArrayReturner.arrayLength);
}
public void process(APDU apdu) throws ISOException {
byte[] buffer=apdu.getBuffer();
Util.arrayCopyNonAtomic(BArrayReturner.theArray, (short)0,buffer , (short) 0, (short)0x40);
apdu.setOutgoingAndSend((short)0, (short)255);
}
}
将上述程序转换为.cap
文件后,我用WinRAR打开cap文件并更改.CAP[=的一个字节52=] 文件如下:
(我在class.cap的第九次再见中用0x78
代替了0x07
。
点击放大:
现在我尝试安装这个新的 cap 文件。但不仅安装失败,而且我无法再列出我的卡的内容:
GlobalPlatfomPro:: gp -list -v -d
# Detected readers
[*] ACS CCID USB Reader 0
SCardConnect("ACS CCID USB Reader 0", T=*) -> T=0
SCardBeginTransaction("ACS CCID USB Reader 0")
Reader: ACS CCID USB Reader 0
ATR: 3B68XxXxXxXxXxXx009000
More information about your card:
http://smartcard-atr.appspot.com/parse?ATR=3B68XxXxXxXxXxXx009000
A>> T=0 (4+0000) 00A40400 00
A<< (0000+2) (20ms) 6F00
SCardEndTransaction()
SCardDisconnect("ACS CCID USB Reader 0", false)
Exception in thread "main" java.lang.IllegalStateException: No selected ISD!
at openkms.gp.GlobalPlatform.openSecureChannel(GlobalPlatform.java:327)
at openkms.gp.GPTool.main(GPTool.java:280)
我的问题:
这个新生成的 CAP 文件在我的智能卡上发生了什么?有谁知道原始文件和被操纵文件中的字节码和该字节的含义吗?这是对安装被操纵文件的合理回应吗?
注1:
我也尝试在我的 JCOP 卡上安装这个新的 cap 文件。安装再次失败,但没有出现上述错误,卡静音了大约 15 分钟。 (必须卡在15分钟左右reader才能再次激活!)
注2:
我试图更改此文件的第 10 个字节而不是第 9 个字节。所以我用 0x45
替换了 0x01
。之后我成功安装了新的 CAP 文件!卡不应该在字节码验证后检测到这种操纵并阻止安装吗?
您成功触发卡牌防御机制!
根据您所做的更改,字节码验证器要么失败并使卡静音,要么通过测试。 cap 文件只是一个容器。如果你想要更深入的分析,你必须阅读更多关于实际的 Java Card Byte code
我有一张 Java 卡可以正常工作:
GlobalPlatfomPro:: gp -list
AID: A000000003000000 (|........|)
ISD OP_READY: Security Domain, Card lock, Card terminate, Default selected,
CVM (PIN) management
我在接收到每个命令时将一个简单的程序写入 return APDU 缓冲区:
public class BArrayReturner extends Applet {
public static byte[] theArray={(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff,(byte)0xff};
public static short arrayLength=0;
private BArrayReturner() {
}
public static void install(byte bArray[], short bOffset, byte bLength)
throws ISOException {
new BArrayReturner().register();
BArrayReturner.arrayLength=(short)bArray.length;
Util.arrayCopyNonAtomic(bArray, (short)0,BArrayReturner.theArray , (short) 0, BArrayReturner.arrayLength);
}
public void process(APDU apdu) throws ISOException {
byte[] buffer=apdu.getBuffer();
Util.arrayCopyNonAtomic(BArrayReturner.theArray, (short)0,buffer , (short) 0, (short)0x40);
apdu.setOutgoingAndSend((short)0, (short)255);
}
}
将上述程序转换为.cap
文件后,我用WinRAR打开cap文件并更改.CAP[=的一个字节52=] 文件如下:
(我在class.cap的第九次再见中用0x78
代替了0x07
。
点击放大:
现在我尝试安装这个新的 cap 文件。但不仅安装失败,而且我无法再列出我的卡的内容:
GlobalPlatfomPro:: gp -list -v -d
# Detected readers
[*] ACS CCID USB Reader 0
SCardConnect("ACS CCID USB Reader 0", T=*) -> T=0
SCardBeginTransaction("ACS CCID USB Reader 0")
Reader: ACS CCID USB Reader 0
ATR: 3B68XxXxXxXxXxXx009000
More information about your card:
http://smartcard-atr.appspot.com/parse?ATR=3B68XxXxXxXxXxXx009000
A>> T=0 (4+0000) 00A40400 00
A<< (0000+2) (20ms) 6F00
SCardEndTransaction()
SCardDisconnect("ACS CCID USB Reader 0", false)
Exception in thread "main" java.lang.IllegalStateException: No selected ISD!
at openkms.gp.GlobalPlatform.openSecureChannel(GlobalPlatform.java:327)
at openkms.gp.GPTool.main(GPTool.java:280)
我的问题:
这个新生成的 CAP 文件在我的智能卡上发生了什么?有谁知道原始文件和被操纵文件中的字节码和该字节的含义吗?这是对安装被操纵文件的合理回应吗?
注1:
我也尝试在我的 JCOP 卡上安装这个新的 cap 文件。安装再次失败,但没有出现上述错误,卡静音了大约 15 分钟。 (必须卡在15分钟左右reader才能再次激活!)
注2:
我试图更改此文件的第 10 个字节而不是第 9 个字节。所以我用 0x45
替换了 0x01
。之后我成功安装了新的 CAP 文件!卡不应该在字节码验证后检测到这种操纵并阻止安装吗?
您成功触发卡牌防御机制! 根据您所做的更改,字节码验证器要么失败并使卡静音,要么通过测试。 cap 文件只是一个容器。如果你想要更深入的分析,你必须阅读更多关于实际的 Java Card Byte code