gpt4 book ai didi

security - 如何自锁 Javacard 小程序

转载 作者:行者123 更新时间:2023-12-04 05:11:53 26 4
gpt4 key购买 nike

我的问题是是否有可能从小程序本身的代码中锁定小程序,作为对代码中检测到的操作的对策。

显而易见的选择是使用 GPSystem.lockCard();它有效,但是我想知道是否可以只锁定小程序。我还可以从相关安全域的经过身份验证的 session 中锁定小程序本身。但是从小程序代码本身是否可能。看来,鉴于 GPSystem.setCardContentState();GPSystem.APPLICATION_LOCKED 一起使用的方法,所以我也测试过,但它不起作用。

重读GP卡规范2.2 PDF的说明:

The OPEN shall reject any transition request from the Life Cycle State LOCKED;



在我的 Eclipse 中,JavaDoc 说:

The OPEN shall reject any transition request to the Life Cycle State LOCKED



这里发生了什么?

最佳答案

看看这个机制如何从 GlobalPlatform Card 规范 2.1.1 演变到 2.2.1(在 2.3 中仍然相同)很有趣:

  • 在 GP 2.1.1 中,仅允许发卡机构(卡外实体)或 OPEN(作为“异常”的结果)启动应用程序的锁定:

    The Card Issuer has a mechanism to disable the continued execution status of an on-card Application. This mechanism may be invoked from within the OPEN based on exceptions handled by the OPEN or from the use of externally invoked commands. The Card Issuer is the only entity that may initiate the locking of an Application.



    方法GPSystem.setCardContentState()明确定义为仅允许更改应用程序特定的生命周期状态(值介于 0x070x7F 之间,最低 3 位设置)。由于APPLICATION_LOCKED的常数在后面的规范中是 0x80不允许设置此状态。在此方法的注释中也明确说明了这一点:

    • The OPEN shall reject any transition request to the Life Cycle States INSTALLED or LOCKED.


    因此,在实现 GP 2.1.1 的卡上,尝试从应用程序本身中将应用程序状态设置为锁定必须失败。

    更新 (2016-05-20): 我在一些 NXP JCOP 卡(声称符合 GP 2.1.1)上对此进行了测试,并且设置了高位设置或任何低 3 位清除的值确实失败了。

  • 这在 GP 2.2 中发生了变化。现在,允许应用程序锁定自身:

    The card has a mechanism to disable and subsequently re-enable the continued execution status of an on-card Application. This mechanism may be invoked from within the OPEN based on exceptions handled by the OPEN or from the use of externally invoked commands. An Application with Global Lock privilege, the Application itself or a directly or indirectly associated Security Domain are the only entities that may initiate the locking of an Application.



    GP 卡规范不要求应用程序持有任何特定的权限来锁定自身。

    不幸的是,该方法的 API 规范GPSystem.setCardContentState()还是不太清楚。首先,该方法的描述仍然指出只有 0x07 之间的值。和 0x7F必须允许设置最低 3 位:

    This method sets the Application specific Life Cycle State of the current applet context. Application specific Life Cycle States range from 0x07 to 0x7F as long as the 3 low order bits are set.



    其次,作为 GP 卡规范 2.2 文档的附录 A 的一部分的 API 文档和 API 导出文件中的 JavaDoc 中存在偏离注释。虽然规范中的注释已更改为:

    • The OPEN shall reject any transition request to the Life Cycle State INSTALLED;
    • The OPEN shall reject any transition request from the Life Cycle State LOCKED;


    API 导出文件(GPSystem.java 和 JavaDoc)中的注释与 GP 2.1.1 中的相同。

    因此,如果这个方法是根据规范实现的,它仍然应该拒绝将应用程序生命周期状态设置为 APPLICATION_LOCKED .

    更新 (2016-05-20): 我在 NXP J3D081 (JCOP v2.4.2 R2) 卡(据称符合 GP 2.2)上对此进行了测试。不幸的是,设置高位设置或任何低 3 位清除的值失败。

    但是,也有方法GPRegistryEntry.setState() .此方法的文档指出:

    • A transition request to Life Cycle state other than APPLICATION_LOCKED and APPLICATION_UNLOCKED shall be accepted only if the invoking Application corresponds to this GPRegistryEntry;
    • An Application shall be able to lock and shall not be able to unlock itself;


    因此,看看以下是否在使用 setCardContentState() 的同一张卡上工作会很有趣。失败的:
    GPSystem.getRegistryEntry(null).setState(GPSystem.APPLICATION_LOCKED);

    更新 (2016-05-20): 我在 NXP J3D081 (JCOP v2.4.2 R2) 卡(据称符合 GP 2.2)上对此进行了测试。不幸的是,这也失败了。顺便提一句。如果 null 似乎没有什么区别或 JCSystem.getAID()用作 getRegistryEntry() 的参数.

    更新 (2016-06-14): 根据 Paul Bastian ,恩智浦代表已确认应用程序无法在 JCOP v2.4.x 卡上将自身设置为锁定状态。

    更新 (2016-06-06): 我在英飞凌 SLE97CNFX 卡(据称符合 GP 2.2.1)上对此进行了测试,结果奏效。我可以使用 APPLICATION_LOCKED 成功地将状态设置为锁定(0x80)。然后将状态设置为 previous_state | 0x80 .尝试设置具有高位设置的其他状态值(例如 0x8F)不起作用(正如我预期的那样)。

  • 在 GP 2.2.1 中,方法的文档 GPSystem.setCardContentState()被改变(再次)。更改说明清楚地表明该方法已更新,现在允许应用程序锁定自身(导出文件版本 1.5。映射到 GP 2.2.1):

    • export file version 1.5: this method now allows the application associated with the current applet context to lock itself.


    方法定义改为:

    This method allows the application associated with the current applet context to change its state to an application specific life cycle state or to lock itself. An application cannot unlock itself using this method.



    传递给该方法的 state 参数的值范围现在明确包括值 APPLICATION_LOCKED :

    bState - an application specific life cycle state (0x07 to 0x7F with 3 low order bits set), or APPLICATION_LOCKED (0x80).



    因此,实现 GP 2.2.1 或更高版本的卡最终应该允许应用程序使用方法 GPSystem.setCardContentState() 将它们自己的生命周期状态更改为锁定。 .

    更新 (2016-06-06): 我在英飞凌 SLE97CNFX 卡(据称符合 GP 2.2.1(或者是 2.3?))上对此进行了测试,并且它工作正常。我可以使用 APPLICATION_LOCKED 成功地将状态设置为锁定(0x80)。然后将状态设置为 previous_state | 0x80 .尝试设置具有高位设置的其他状态值(例如 0x8F)不起作用(正如我预期的那样)。


  • 替代解决方案

    在无法将应用程序生命周期设置为状态 APPLICATION_LOCKED 的情况下,您可以采取哪些措施来克服您的问题, 是使用特定于应用程序的生命周期状态:
    public class LockableApplet extends Applet {

    [... applet installation / instantiation code ...]

    private static final byte APPLICATION_STATE_UNLOCKED = (byte)0x07;
    private static final byte APPLICATION_STATE_LOCKED = (byte)0x7F;

    public boolean select() {
    if (GPSystem.getCardContentState() == APPLICATION_STATE_LOCKED) {
    return false;
    }

    return true;
    }

    public void process(APDU apdu) {
    if (selectingApplet()) {
    return;
    }

    if (GPSystem.getCardContentState() == APPLICATION_STATE_LOCKED) {
    ISOException.throwIt(ISO7816.SW_SECURITY_STATUS_NOT_SATISFIED);
    }

    [... applet logic code ...]

    }
    }

    在检测到应该导致您的应用程序被锁定的问题后,您可以使用以下调用锁定小程序:
    GPSystem.setCardContentState(APPLICATION_STATE_LOCKED);

    您可以稍后通过安全域使用 SET STATUS 命令再次解锁应用程序。

    关于security - 如何自锁 Javacard 小程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37143978/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com