Skip to content

OTP page accepts "zeroing" while emulating MFUL EV1 #2790

@mishamyte

Description

@mishamyte

Describe the bug
I'm working with a Vizit reader, which has some filter (also called firewalls in English and Chinese terminology) against copies (variations of USCUID-UL tag) and emulators.
The latest filter can't be bypassed by Proxmark3, because of the wrong implementation of OTP page.

So I use the tag with next data in OTP page (hereinafter: OTP):

3/0x03 | CC 3B F5 8C | 1 | .;..

Based on the datasheet:

The parameter bytes of the WRITE command and the current contents of the OTP bytes
are bit-wise OR’ed. The result is the new OTP byte contents. This process is irreversible
and once a bit is set to logic 1, **it cannot be changed back to logic 0**.

So that concept is used by filter. It reads OTP values, then tries to write 00 00 00 00 here, reads it again for validation and writes initial values back.
We are interested in next part of the trace.

For Proxmark3 emulation it's:

    3674642 |    3684018 | Rdr |A2  03  00  00  00  00  EB  A2                                           |  ok | WRITEBLOCK(3)
    3686086 |    3686662 | Tag |0A(3)                                                                    |     |
    3718014 |    3722718 | Rdr |30  03  99  9A                                                           |  ok | READBLOCK(3)
    3727410 |    3748274 | Tag |00  00  00  00  77  FF  D8  64  E1  CC  B1  63  4B  A4  94  F0  2E  34   |  ok |
    3846968 |    3856280 | Rdr |A2  03  CC  3B  F5  8C  DA  ED                                           |  ok | WRITEBLOCK(3)
    3858540 |    3859116 | Tag |0A(3)                                                                    |     |

For original tag it's:

   13601520 |   13610896 | Rdr |A2  03  00  00  00  00  EB  A2                                           |  ok | WRITEBLOCK(3)
   13612068 |   13612708 | Tag |00(4)                                                                    |     |
   13643600 |   13648304 | Rdr |30  03  99  9A                                                           |  ok | READBLOCK(3)
   13864880 |   13869648 | Rdr |50  00  57  CD                                                           |  ok | HALT

The same behavior as an original tag has is also implemented in Flipper Zero tool.

As we can see, incorrect behavior in Proxmark3 leads that it can't be used against those (and similar readers) and is incorrect.

Potentially it can be the same for Capability Container bytes of NTAGs, but I had no opportunity to check it.

Expected behavior
Proxmark3 will NACK to an invalid attempt and won't change OTP bytes values in emu memory.

Desktop (please complete the following information):

  • OS: Win10 (19045.5608)
  • Client.... Iceman/master/v4.19552-465-g7b528a856-dirty 2025-03-19 00:57:41
    Bootrom... Iceman/master/v4.19552-465-g7b528a856-dirty-suspect 2025-03-19 00:58:31
    OS........ Iceman/master/v4.19552-465-g7b528a856-dirty-suspect 2025-03-19 00:58:54
    Target.... RDV4

Tag dump and traces from PM3, Tag & Flipper Zero are attached:
hf-mfu-04C9D0427A1790-dump.json
traces.zip

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions