Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix chip-tool PersistentStorageDelegate failing on some keys #20239

Merged
merged 3 commits into from
Jul 2, 2022

Conversation

tcarmelveilleux
Copy link
Contributor

Problem

  • chip-tool's PersistentStorageDelegate failed the audit:
[1656721506.201383][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:248: assertion failed: "err == CHIP_NO_ERROR"
[1656721506.201409][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:249: assertion failed: "size == strlen(kBase64SymbolValues)"
[1656721506.201413][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:250: assertion failed: "0 == memcmp(&buf[0], kBase64SymbolValues, strlen(kBase64SymbolValues))"
[1656721506.201437][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:255: assertion failed: "err == CHIP_NO_ERROR"
  • The audit also crashed on SyncSetKeyValue with nullptr argument

  • To fail the audit, had to run the audit on a version that forcibly loaded what
    was stored again.

  • Root cause was base64 padding has = which confuses INI parser into
    giving out keys that are too small

Issue #20188

Change overview

This PR:

  • Implements SyncDoesKeyExist natively
  • Fixes handling of nullptr arguments and zero-size keys in the storage impl
  • Uses \x00 C-style hex escaping for any characters that could fool the INI parser,
    which retains human readability of keys in the INI files, but fixes the bugs
    found by the audit
  • Removes unnecessary newlines in storage audit logging

Testing

  • Unit tests still pass
  • Cert tests still pass
  • Storage audit passed
[1656722163.492413][696066:696066] CHIP:ATM: ==== PersistentStorageDelegate API audit: SUCCESS ====

- chip-tool's PersistentStorageDelegate failed the audit:

```
[1656721506.201383][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:248: assertion failed: "err == CHIP_NO_ERROR"
[1656721506.201409][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:249: assertion failed: "size == strlen(kBase64SymbolValues)"
[1656721506.201413][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:250: assertion failed: "0 == memcmp(&buf[0], kBase64SymbolValues, strlen(kBase64SymbolValues))"
[1656721506.201437][688277:688277] CHIP:ATM: ../../../examples/chip-tool/third_party/connectedhomeip/src/lib/support/PersistentStorageAudit.cpp:255: assertion failed: "err == CHIP_NO_ERROR"
```

- The audit also crashed on SyncSetKeyValue with nullptr argument

- To fail the audit, had to run the audit on a version that forcibly loaded what
  was stored again.
- Root cause was base64 padding has `=` which confuses INI parser into
  giving out keys that are too small

Issue project-chip#20188

This PR:
- Implements `SyncDoesKeyExist` natively
- Fixes handling of `nullptr` arguments and zero-size keys in the storage impl
- Uses `\x00` C-style hex escaping for any characters that could fool the INI parser,
  which retains human readability of keys in the INI files, but fixes the bugs
  found by the audit
- Removes unnecessary newliens in storage audit logging

Testing done:
- Unit tests still pass
- Cert tests still pass
- Storage audit passed

```
[1656722163.492413][696066:696066] CHIP:ATM: ==== PersistentStorageDelegate API audit: SUCCESS ====
```
@github-actions
Copy link

github-actions bot commented Jul 2, 2022

PR #20239: Size comparison from e491f85 to d75823a

Increases (2 builds for cc13x2_26x2, linux)
platform target config section e491f85 d75823a change % change
cc13x2_26x2 pump-app LP_CC2652R7 (read only) 677287 677295 8 0.0
.text 588364 588372 8 0.0
linux chip-tool-no-interactive-ipv6only arm64 (read only) 9908068 9909796 1728 0.0
.text 7894292 7896020 1728 0.0
Decreases (5 builds for cc13x2_26x2, cyw30739, telink)
platform target config section e491f85 d75823a change % change
cc13x2_26x2 lock-mtd LP_CC2652R7 (read only) 617359 617351 -8 -0.0
.text 540800 540792 -8 -0.0
pump-app LP_CC2652R7 (read/write) 164928 164920 -8 -0.0
cyw30739 light cyw930739m2evb_01 (read/write) 578750 578742 -8 -0.0
.app_xip_area 457528 457520 -8 -0.0
telink light-switch-app tlsr9518adk80d text 564974 564970 -4 -0.0
lighting-app tlsr9518adk80d (read/write) 816340 816332 -8 -0.0
text 581330 581326 -4 -0.0
Full report (28 builds for cc13x2_26x2, cyw30739, efr32, k32w, linux, mbed, nrfconnect, p6, telink)
platform target config section e491f85 d75823a change % change
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read only) 665363 665363 0 0.0
(read/write) 185860 185860 0 0.0
.bss 74116 74116 0 0.0
.data 3356 3356 0 0.0
.rodata 88099 88099 0 0.0
.text 576948 576948 0 0.0
all-clusters-minimal-app LP_CC2652R7 (read only) 654139 654139 0 0.0
(read/write) 196380 196380 0 0.0
.bss 73412 73412 0 0.0
.data 3356 3356 0 0.0
.rodata 91579 91579 0 0.0
.text 562244 562244 0 0.0
lock-ftd LP_CC2652R7 (read only) 667943 667943 0 0.0
(read/write) 173424 173424 0 0.0
.bss 71148 71148 0 0.0
.data 3280 3280 0 0.0
.rodata 76191 76191 0 0.0
.text 591272 591272 0 0.0
lock-mtd LP_CC2652R7 (read only) 617359 617351 -8 -0.0
(read/write) 144264 144264 0 0.0
.bss 66868 66868 0 0.0
.data 3280 3280 0 0.0
.rodata 76071 76071 0 0.0
.text 540800 540792 -8 -0.0
pump-app LP_CC2652R7 (read only) 677287 677295 8 0.0
(read/write) 164928 164920 -8 -0.0
.bss 71228 71228 0 0.0
.data 3280 3280 0 0.0
.rodata 88439 88439 0 0.0
.text 588364 588372 8 0.0
pump-controller-app LP_CC2652R7 (read only) 663119 663119 0 0.0
(read/write) 179216 179216 0 0.0
.bss 71348 71348 0 0.0
.data 3276 3276 0 0.0
.rodata 84279 84279 0 0.0
.text 578360 578360 0 0.0
shell LP_CC2652R7 (read only) 657806 657806 0 0.0
(read/write) 188920 188920 0 0.0
.bss 76420 76420 0 0.0
.data 3360 3360 0 0.0
.rodata 84846 84846 0 0.0
.text 572644 572644 0 0.0
cyw30739 light cyw930739m2evb_01 (read/write) 578750 578742 -8 -0.0
.app_xip_area 457528 457520 -8 -0.0
.bss 64184 64184 0 0.0
.data 716 716 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
lock cyw930739m2evb_01 (read/write) 580398 580398 0 0.0
.app_xip_area 458984 458984 0 0.0
.bss 64376 64376 0 0.0
.data 720 720 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
ota-requestor-no-progress-logging cyw930739m2evb_01 (read/write) 581814 581814 0 0.0
.app_xip_area 461440 461440 0 0.0
.bss 63392 63392 0 0.0
.data 660 660 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
efr32 lighting-app BRD4161A (read/write) 1080172 1080172 0 0.0
.bss 132996 132996 0 0.0
.data 2048 2048 0 0.0
.text 945108 945108 0 0.0
window-app BRD4161A (read/write) 1065436 1065436 0 0.0
.bss 133076 133076 0 0.0
.data 2076 2076 0 0.0
.text 930260 930260 0 0.0
lighting-app BRD4161A+rpc (read/write) 1134532 1134532 0 0.0
.bss 149676 149676 0 0.0
.data 2260 2260 0 0.0
.text 982576 982576 0 0.0
BRD4161A+rs911x (read/write) 946276 946276 0 0.0
.bss 140768 140768 0 0.0
.data 2048 2048 0 0.0
.text 803440 803440 0 0.0
lock-app BRD4161A+wf200 (read/write) 1126920 1126920 0 0.0
.bss 144184 144184 0 0.0
.data 2060 2060 0 0.0
.text 980652 980652 0 0.0
k32w light k32w061+release (read/write) 658112 658112 0 0.0
.bss 69516 69516 0 0.0
.data 1992 1992 0 0.0
.text 580804 580804 0 0.0
lock k32w061+release (read/write) 684692 684692 0 0.0
.bss 69980 69980 0 0.0
.data 2004 2004 0 0.0
.text 606908 606908 0 0.0
linux chip-tool-no-interactive-ipv6only arm64 (read only) 9908068 9909796 1728 0.0
(read/write) 676609 676609 0 0.0
.bss 42609 42609 0 0.0
.data 1152 1152 0 0.0
.data.rel.ro 615592 615592 0 0.0
.dynamic 528 528 0 0.0
.got 13448 13448 0 0.0
.init 24 24 0 0.0
.init_array 192 192 0 0.0
.rodata 471876 471876 0 0.0
.text 7894292 7896020 1728 0.0
thermostat-no-ble arm64 (read only) 2591988 2591988 0 0.0
(read/write) 158289 158289 0 0.0
.bss 65249 65249 0 0.0
.data 1704 1704 0 0.0
.data.rel.ro 83240 83240 0 0.0
.dynamic 528 528 0 0.0
.got 5072 5072 0 0.0
.init 24 24 0 0.0
.init_array 400 400 0 0.0
.rodata 165348 165348 0 0.0
.text 2186864 2186864 0 0.0
mbed lock-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2447312 2447312 0 0.0
.bss 213940 213940 0 0.0
.data 5872 5872 0 0.0
.text 1409956 1409956 0 0.0
nrfconnect all-clusters-app nrf52840dk_nrf52840 (read/write) 1173179 1173179 0 0.0
bss 142900 142900 0 0.0
rodata 141356 141356 0 0.0
text 810024 810024 0 0.0
all-clusters-minimal-app nrf52840dk_nrf52840 (read/write) 1154031 1154031 0 0.0
bss 142136 142136 0 0.0
rodata 133288 133288 0 0.0
text 799720 799720 0 0.0
p6 all-clusters-app default (read/write) 2562928 2562928 0 0.0
.bss 149120 149120 0 0.0
.data 2776 2776 0 0.0
.text 1521192 1521192 0 0.0
all-clusters-minimal-app default (read/write) 2508792 2508792 0 0.0
.bss 148400 148400 0 0.0
.data 2776 2776 0 0.0
.text 1467056 1467056 0 0.0
light-app default (read/write) 2439160 2439160 0 0.0
.bss 140456 140456 0 0.0
.data 2592 2592 0 0.0
.text 1397424 1397424 0 0.0
lock-app default (read/write) 2465576 2465576 0 0.0
.bss 140304 140304 0 0.0
.data 2600 2600 0 0.0
.text 1423840 1423840 0 0.0
telink light-switch-app tlsr9518adk80d (read/write) 796472 796472 0 0.0
bss 70576 70576 0 0.0
noinit 40416 40416 0 0.0
text 564974 564970 -4 -0.0
lighting-app tlsr9518adk80d (read/write) 816340 816332 -8 -0.0
bss 71420 71420 0 0.0
noinit 40416 40416 0 0.0
text 581330 581326 -4 -0.0

@github-actions
Copy link

github-actions bot commented Jul 2, 2022

PR #20239: Size comparison from e491f85 to 1518e5e

Increases (4 builds for cc13x2_26x2, linux)
platform target config section e491f85 1518e5e change % change
cc13x2_26x2 all-clusters-minimal-app LP_CC2652R7 (read/write) 196380 196388 8 0.0
pump-app LP_CC2652R7 (read only) 677287 677295 8 0.0
.text 588364 588372 8 0.0
pump-controller-app LP_CC2652R7 (read only) 663119 663127 8 0.0
.text 578360 578368 8 0.0
linux chip-tool-no-interactive-ipv6only arm64 (read only) 9908068 9909780 1712 0.0
.text 7894292 7896004 1712 0.0
Decreases (5 builds for cc13x2_26x2, telink)
platform target config section e491f85 1518e5e change % change
cc13x2_26x2 all-clusters-minimal-app LP_CC2652R7 (read only) 654139 654131 -8 -0.0
.text 562244 562236 -8 -0.0
pump-app LP_CC2652R7 (read/write) 164928 164920 -8 -0.0
pump-controller-app LP_CC2652R7 (read/write) 179216 179208 -8 -0.0
telink light-switch-app tlsr9518adk80d text 564974 564970 -4 -0.0
lighting-app tlsr9518adk80d (read/write) 816340 816332 -8 -0.0
text 581330 581328 -2 -0.0
Full report (30 builds for cc13x2_26x2, cyw30739, efr32, esp32, k32w, linux, mbed, nrfconnect, p6, telink)
platform target config section e491f85 1518e5e change % change
cc13x2_26x2 all-clusters-app LP_CC2652R7 (read only) 665363 665363 0 0.0
(read/write) 185860 185860 0 0.0
.bss 74116 74116 0 0.0
.data 3356 3356 0 0.0
.rodata 88099 88099 0 0.0
.text 576948 576948 0 0.0
all-clusters-minimal-app LP_CC2652R7 (read only) 654139 654131 -8 -0.0
(read/write) 196380 196388 8 0.0
.bss 73412 73412 0 0.0
.data 3356 3356 0 0.0
.rodata 91579 91579 0 0.0
.text 562244 562236 -8 -0.0
lock-ftd LP_CC2652R7 (read only) 667943 667943 0 0.0
(read/write) 173424 173424 0 0.0
.bss 71148 71148 0 0.0
.data 3280 3280 0 0.0
.rodata 76191 76191 0 0.0
.text 591272 591272 0 0.0
lock-mtd LP_CC2652R7 (read only) 617359 617359 0 0.0
(read/write) 144264 144264 0 0.0
.bss 66868 66868 0 0.0
.data 3280 3280 0 0.0
.rodata 76071 76071 0 0.0
.text 540800 540800 0 0.0
pump-app LP_CC2652R7 (read only) 677287 677295 8 0.0
(read/write) 164928 164920 -8 -0.0
.bss 71228 71228 0 0.0
.data 3280 3280 0 0.0
.rodata 88439 88439 0 0.0
.text 588364 588372 8 0.0
pump-controller-app LP_CC2652R7 (read only) 663119 663127 8 0.0
(read/write) 179216 179208 -8 -0.0
.bss 71348 71348 0 0.0
.data 3276 3276 0 0.0
.rodata 84279 84279 0 0.0
.text 578360 578368 8 0.0
shell LP_CC2652R7 (read only) 657806 657806 0 0.0
(read/write) 188920 188920 0 0.0
.bss 76420 76420 0 0.0
.data 3360 3360 0 0.0
.rodata 84846 84846 0 0.0
.text 572644 572644 0 0.0
cyw30739 light cyw930739m2evb_01 (read/write) 578750 578750 0 0.0
.app_xip_area 457528 457528 0 0.0
.bss 64184 64184 0 0.0
.data 716 716 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
lock cyw930739m2evb_01 (read/write) 580398 580398 0 0.0
.app_xip_area 458984 458984 0 0.0
.bss 64376 64376 0 0.0
.data 720 720 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
ota-requestor-no-progress-logging cyw930739m2evb_01 (read/write) 581814 581814 0 0.0
.app_xip_area 461440 461440 0 0.0
.bss 63392 63392 0 0.0
.data 660 660 0 0.0
.rodata 0 0 0 0.0
.text 112 112 0 0.0
efr32 lighting-app BRD4161A (read/write) 1080172 1080172 0 0.0
.bss 132996 132996 0 0.0
.data 2048 2048 0 0.0
.text 945108 945108 0 0.0
BRD4161A+rpc (read/write) 1134532 1134532 0 0.0
.bss 149676 149676 0 0.0
.data 2260 2260 0 0.0
.text 982576 982576 0 0.0
BRD4161A+rs911x (read/write) 946276 946276 0 0.0
.bss 140768 140768 0 0.0
.data 2048 2048 0 0.0
.text 803440 803440 0 0.0
lock-app BRD4161A+wf200 (read/write) 1126920 1126920 0 0.0
.bss 144184 144184 0 0.0
.data 2060 2060 0 0.0
.text 980652 980652 0 0.0
window-app BRD4161A (read/write) 1065436 1065436 0 0.0
.bss 133076 133076 0 0.0
.data 2076 2076 0 0.0
.text 930260 930260 0 0.0
esp32 all-clusters-app c3devkit (read only) 1018702 1018702 0 0.0
(read/write) 1484906 1484906 0 0.0
.dram0.bss 70080 70080 0 0.0
.dram0.data 14600 14600 0 0.0
.flash.rodata 214792 214792 0 0.0
.flash.text 1018702 1018702 0 0.0
.iram0.text 62902 62902 0 0.0
m5stack (read only) 1072735 1072735 0 0.0
(read/write) 486984 486984 0 0.0
.dram0.bss 75600 75600 0 0.0
.dram0.data 34144 34144 0 0.0
.flash.rodata 245244 245244 0 0.0
.flash.text 1067351 1067351 0 0.0
.iram0.text 123267 123267 0 0.0
k32w light k32w061+release (read/write) 658112 658112 0 0.0
.bss 69516 69516 0 0.0
.data 1992 1992 0 0.0
.text 580804 580804 0 0.0
lock k32w061+release (read/write) 684692 684692 0 0.0
.bss 69980 69980 0 0.0
.data 2004 2004 0 0.0
.text 606908 606908 0 0.0
linux chip-tool-no-interactive-ipv6only arm64 (read only) 9908068 9909780 1712 0.0
(read/write) 676609 676609 0 0.0
.bss 42609 42609 0 0.0
.data 1152 1152 0 0.0
.data.rel.ro 615592 615592 0 0.0
.dynamic 528 528 0 0.0
.got 13448 13448 0 0.0
.init 24 24 0 0.0
.init_array 192 192 0 0.0
.rodata 471876 471876 0 0.0
.text 7894292 7896004 1712 0.0
thermostat-no-ble arm64 (read only) 2591988 2591988 0 0.0
(read/write) 158289 158289 0 0.0
.bss 65249 65249 0 0.0
.data 1704 1704 0 0.0
.data.rel.ro 83240 83240 0 0.0
.dynamic 528 528 0 0.0
.got 5072 5072 0 0.0
.init 24 24 0 0.0
.init_array 400 400 0 0.0
.rodata 165348 165348 0 0.0
.text 2186864 2186864 0 0.0
mbed lock-app CY8CPROTO_062_4343W+release (read only) 6224 6224 0 0.0
(read/write) 2447312 2447312 0 0.0
.bss 213940 213940 0 0.0
.data 5872 5872 0 0.0
.text 1409956 1409956 0 0.0
nrfconnect all-clusters-app nrf52840dk_nrf52840 (read/write) 1173179 1173179 0 0.0
bss 142900 142900 0 0.0
rodata 141356 141356 0 0.0
text 810024 810024 0 0.0
all-clusters-minimal-app nrf52840dk_nrf52840 (read/write) 1154031 1154031 0 0.0
bss 142136 142136 0 0.0
rodata 133288 133288 0 0.0
text 799720 799720 0 0.0
p6 all-clusters-app default (read/write) 2562928 2562928 0 0.0
.bss 149120 149120 0 0.0
.data 2776 2776 0 0.0
.text 1521192 1521192 0 0.0
all-clusters-minimal-app default (read/write) 2508792 2508792 0 0.0
.bss 148400 148400 0 0.0
.data 2776 2776 0 0.0
.text 1467056 1467056 0 0.0
light-app default (read/write) 2439160 2439160 0 0.0
.bss 140456 140456 0 0.0
.data 2592 2592 0 0.0
.text 1397424 1397424 0 0.0
lock-app default (read/write) 2465576 2465576 0 0.0
.bss 140304 140304 0 0.0
.data 2600 2600 0 0.0
.text 1423840 1423840 0 0.0
telink light-switch-app tlsr9518adk80d (read/write) 796472 796472 0 0.0
bss 70576 70576 0 0.0
noinit 40416 40416 0 0.0
text 564974 564970 -4 -0.0
lighting-app tlsr9518adk80d (read/write) 816340 816332 -8 -0.0
bss 71420 71420 0 0.0
noinit 40416 40416 0 0.0
text 581330 581328 -2 -0.0

@woody-apple woody-apple merged commit b78a6e6 into project-chip:master Jul 2, 2022
tcarmelveilleux added a commit to tcarmelveilleux/connectedhomeip that referenced this pull request Jul 2, 2022
- PR project-chip#20239 got merged before some @bluebin14 had time to review and
  a bug exists where having the escape in a key can collide with
  an escaped key.

This PR:
- Adds the escape character to the escaping set

Testing done:
- Adding key "hello=" and "hello\x3d" leads to different stored
keys
```
key\x3d=MQ==
key\x5cx3d=MQ==
```

- All unit tests pass, integration tests pass
tcarmelveilleux added a commit to tcarmelveilleux/connectedhomeip that referenced this pull request Jul 2, 2022
- PR project-chip#20239 got merged before some @bluebin14 had time to review and
  a bug exists where having the escape in a key can collide with
  an escaped key.

This PR:
- Adds the escape character to the escaping set

Testing done:
- Adding key `key=` and `key\x3d` leads to different stored
keys
```
key\x3d=MQ==
key\x5cx3d=MQ==
```

- All unit tests pass, integration tests pass
woody-apple pushed a commit that referenced this pull request Jul 2, 2022
- PR #20239 got merged before some @bluebin14 had time to review and
  a bug exists where having the escape in a key can collide with
  an escaped key.

This PR:
- Adds the escape character to the escaping set

Testing done:
- Adding key `key=` and `key\x3d` leads to different stored
keys
```
key\x3d=MQ==
key\x5cx3d=MQ==
```

- All unit tests pass, integration tests pass
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

5 participants