-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdraft-ietf-suit-information-model.xml
More file actions
1923 lines (1349 loc) · 122 KB
/
draft-ietf-suit-information-model.xml
File metadata and controls
1923 lines (1349 loc) · 122 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="rfc2629.xslt" ?>
<!-- generated by https://github.com/cabo/kramdown-rfc2629 version 1.3.24 -->
<!DOCTYPE rfc SYSTEM "rfc2629.dtd" [
]>
<?rfc rfcedstyle="yes"?>
<?rfc toc="yes"?>
<?rfc tocindent="yes"?>
<?rfc sortrefs="yes"?>
<?rfc symrefs="yes"?>
<?rfc strict="yes"?>
<?rfc comments="yes"?>
<?rfc inline="yes"?>
<?rfc docmapping="yes"?>
<rfc ipr="trust200902" docName="draft-ietf-suit-information-model-13" category="info">
<front>
<title abbrev="A Firmware Manifest Information Model">A Manifest Information Model for Firmware Updates in IoT Devices</title>
<author initials="B." surname="Moran" fullname="Brendan Moran">
<organization>Arm Limited</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<author initials="H." surname="Tschofenig" fullname="Hannes Tschofenig">
<organization>Arm Limited</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<author initials="H." surname="Birkholz" fullname="Henk Birkholz">
<organization>Fraunhofer SIT</organization>
<address>
<email>[email protected]</email>
</address>
</author>
<date year="2021" month="July" day="08"/>
<area>Security</area>
<workgroup>SUIT</workgroup>
<keyword>Internet-Draft</keyword>
<abstract>
<t>Vulnerabilities with Internet of Things (IoT) devices have raised the need for a reliable and secure firmware update mechanism that is also suitable for constrained devices. Ensuring that devices function and remain secure over their service life requires such an update mechanism to fix vulnerabilities, to update configuration settings, as well as adding new functionality.</t>
<t>One component of such a firmware update is a concise and machine-processable meta-data document, or manifest, that describes the firmware image(s) and offers appropriate protection. This document describes the information that must be present in the manifest.</t>
</abstract>
</front>
<middle>
<section anchor="introduction" title="Introduction">
<t>Vulnerabilities with Internet of Things (IoT) devices have raised the need for a reliable and secure firmware update mechanism that is also suitable for constrained devices. Ensuring that devices function and remain secure over their service life requires such an update mechanism to fix vulnerabilities, to update configuration settings, as well as adding new functionality.</t>
<t>One component of such a firmware update is a concise and machine-processable meta-data document, or manifest, that describes the firmware image(s) and offers appropriate protection. This document describes the information that must be present in the manifest.</t>
<t>This document describes all the information elements required in a manifest to secure firmware updates of IoT devices. Each information element is motiviated by user stories and threats it aims to mitigate. These threats and user stories are not intended to be an exhaustive list of the threats against IoT devices, nor of the possible user stories that describe how to conduct a firmware update. Instead they are intended to describe the threats against firmware updates in isolation and provide sufficient motivation to specify the information elements that cover a wide range of user stories.</t>
<t>To distinguish information elements from their encoding and serialization over the wire this document presents an information model. RFC 3444 <xref target="RFC3444"/> describes the differences between information and data models.</t>
<t>Because this document covers a wide range of user stories and a wide range of threats, not all information elements apply to all scenarios. As a result, various information elements are optional to implement and optional to use, depending on which threats exist in a particular domain of application and which user stories are important for deployments.</t>
</section>
<section anchor="requirements-and-terminology" title="Requirements and Terminology">
<section anchor="requirements-notation" title="Requirements Notation">
<t>The key words “MUST”, “MUST NOT”, “REQUIRED”, “SHALL”, “SHALL
NOT”, “SHOULD”, “SHOULD NOT”, “RECOMMENDED”, “NOT RECOMMENDED”,
“MAY”, and “OPTIONAL” in this document are to be interpreted as
described in BCP 14 <xref target="RFC2119"/> <xref target="RFC8174"/> when, and only when, they
appear in all capitals, as shown here.</t>
<t>Unless otherwise stated these words apply to the design of the manifest format, not its implementation or application. Hence, whenever an information is declared as “REQUIRED” this implies that the manifest format document has to include support for it.</t>
</section>
<section anchor="terminology" title="Terminology">
<t>This document uses terms defined in <xref target="I-D.ietf-suit-architecture"/>.
The term ‘Operator’ refers to both Device and Network Operator.</t>
<t>Secure time and secure clock refer to a set of requirements on time sources. For local time sources, this primarily means that the clock must be monotonically increasing, including across power cycles, firmware updates, etc. For remote time sources, the provided time must be both authenticated and guaranteed to be correct to within some predetermined bounds, whenever the time source is accessible.</t>
<t>The term Envelope is used to describe an encoding that allows the bundling of a manifest with related information elements that are not directly contained within the manifest.</t>
<t>The term Payload is used to describe the data that is delivered to a device during an update. This is distinct from a “firmware image”, as described in <xref target="I-D.ietf-suit-architecture"/>, because the payload is often in an intermediate state, such as being encrypted, compressed and/or encoded as a differential update. The payload, taken in isolation, is often not the final firmware image.</t>
</section>
</section>
<section anchor="manifest-information-elements" title="Manifest Information Elements">
<t>Each manifest information element is anchored in a security requirement or a usability requirement. The manifest elements are described below, justified by their requirements.</t>
<section anchor="element-version-id" title="Version ID of the Manifest Structure">
<t>An identifier that describes which iteration of the manifest format is contained in the structure. This allows devices to identify the version of the manifest data model that is in use.</t>
<t>This element is REQUIRED.</t>
</section>
<section anchor="element-sequence-number" title="Monotonic Sequence Number">
<t>A monotonically increasing (unsigned) sequence number to prevent malicious actors from reverting a firmware update against the policies of the relevant authority. This number must not wrap around.</t>
<t>For convenience, the monotonic sequence number may be a UTC timestamp. This allows global synchronisation of sequence numbers without any additional management.</t>
<t>This element is REQUIRED.</t>
<t>Implements: <xref target="req-sec-sequence">REQ.SEC.SEQUENCE</xref></t>
</section>
<section anchor="element-vendor-id" title="Vendor ID">
<t>The Vendor ID element helps to distinguish between identically named products from different vendors. Vendor ID is not intended to be a human-readable element. It is intended for binary match/mismatch comparison only.</t>
<t>Recommended practice is to use <xref target="RFC4122"/> version 5 UUIDs with the vendor’s domain name and the DNS name space ID. Other options include type 1 and type 4 UUIDs.</t>
<t>Fixed-size binary identifiers are preferred because they are simple to match, unambiguous in length, explicitly non-parsable, and require no issuing authority. Guaranteed unique integers are preferred because they are small and simple to match, however they may not be fixed length and they may require an issuing authority to ensure uniqueness. Free-form text is avoided because it is variable-length, prone to error, and often requires parsing outside the scope of the manifest serialization.</t>
<t>If human-readable content is required, it SHOULD be contained in a separate manifest information element: <xref target="manifest-element-text">Manifest text information</xref></t>
<t>This element is RECOMMENDED.</t>
<t>Implements: <xref target="req-sec-compatible">REQ.SEC.COMPATIBLE</xref>, <xref target="req-sec-authentic-compatibility">REQ.SEC.AUTH.COMPATIBILITY</xref>.</t>
<t>Here is an example for a domain name-based UUID. Vendor A creates a UUID based on a domain name it controls, such as vendorId = UUID5(DNS, “vendor-a.example”)</t>
<t>Because the DNS infrastructure prevents multiple registrations of the same domain name, this UUID is (with very high probability) guaranteed to be unique. Because the domain name is known, this UUID is reproducible. Type 1 and type 4 UUIDs produce similar guarantees of uniqueness, but not reproducibility.</t>
<t>This approach creates a contention when a vendor changes its name or relinquishes control of a domain name. In this scenario, it is possible that another vendor would start using that same domain name. However, this UUID is not proof of identity; a device’s trust in a vendor must be anchored in a cryptographic key, not a UUID.</t>
</section>
<section anchor="element-class-id" title="Class ID">
<t>A device “Class” is a set of different device types that can accept the same firmware update without modification. It thereby allows devices to determine applicability of a firmware in an unambiguous way. Class IDs must be unique within the scope of a Vendor ID. This is to prevent similarly, or identically named devices colliding in their customer’s infrastructure.</t>
<t>Recommended practice is to use <xref target="RFC4122"/> version 5 UUIDs with as much information as necessary to define firmware compatibility. Possible information used to derive the class UUID includes:</t>
<t><list style="symbols">
<t>model name or number</t>
<t>hardware revision</t>
<t>runtime library version</t>
<t>bootloader version</t>
<t>ROM revision</t>
<t>silicon batch number</t>
</list></t>
<t>The Class ID UUID should use the Vendor ID as the name space identifier. Classes may be more fine-grained granular than is required to identify firmware compatibility. Classes must not be less granular than is required to identify firmware compatibility. Devices may have multiple Class IDs.</t>
<t>Class ID is not intended to be a human-readable element. It is intended for binary match/mismatch comparison only. A manifest serialization SHOULD NOT permit free-form text content to be used for Class ID. A fixed-size binary identifier SHOULD be used.</t>
<t>Some organizations desire to keep the same product naming across multiple, incompatible hardware revisions for ease of user experience. If this naming is propagated into the firmware, then matching a specific hardware version becomes a challenge. An opaque, non-readable binary identifier has no naming implications and so is more likely to be usable for distinguishing among incompatible device groupings, regardless of naming.</t>
<t>Fixed-size binary identifiers are preferred because they are simple to match, unambiguous in length, opaque and free from naming implications, and explicitly non-parsable. Free-form text is avoided because it is variable-length, prone to error, often requires parsing outside the scope of the manifest serialization, and may be homogenized across incompatible device groupings.</t>
<t>If Class ID is not implemented, then each logical device class must use a unique trust anchor for authorization.</t>
<t>This element is RECOMMENDED.</t>
<t>Implements: Security Requirement <xref target="req-sec-compatible">REQ.SEC.COMPATIBLE</xref>, <xref target="req-sec-authentic-compatibility">REQ.SEC.AUTH.COMPATIBILITY</xref>.</t>
<section anchor="example-1-different-classes" title="Example 1: Different Classes">
<t>Vendor A creates product Z and product Y. The firmware images of products Z and Y are not interchangeable. Vendor A creates UUIDs as follows:</t>
<t><list style="symbols">
<t>vendorId = UUID5(DNS, “vendor-a.example”)</t>
<t>ZclassId = UUID5(vendorId, “Product Z”)</t>
<t>YclassId = UUID5(vendorId, “Product Y”)</t>
</list></t>
<t>This ensures that Vendor A’s Product Z cannot install firmware for Product Y and Product Y cannot install firmware for Product Z.</t>
</section>
<section anchor="example-2-upgrading-class-id" title="Example 2: Upgrading Class ID">
<t>Vendor A creates product X. Later, Vendor A adds a new feature to product X, creating product X v2. Product X requires a firmware update to work with firmware intended for product X v2.</t>
<t>Vendor A creates UUIDs as follows:</t>
<t><list style="symbols">
<t>vendorId = UUID5(DNS, “vendor-a.example”)</t>
<t>XclassId = UUID5(vendorId, “Product X”)</t>
<t>Xv2classId = UUID5(vendorId, “Product X v2”)</t>
</list></t>
<t>When product X receives the firmware update necessary to be compatible with product X v2, part of the firmware update changes the class ID to Xv2classId.</t>
</section>
<section anchor="example-3-shared-functionality" title="Example 3: Shared Functionality">
<t>Vendor A produces two products, product X and product Y. These components share a common core (such as an operating system), but have different applications. The common core and the applications can be updated independently. To enable X and Y to receive the same common core update, they require the same class ID. To ensure that only product X receives application X and only product Y receives application Y, product X and product Y must have different class IDs. The vendor creates Class IDs as follows:</t>
<t><list style="symbols">
<t>vendorId = UUID5(DNS, “vendor-a.example”)</t>
<t>XclassId = UUID5(vendorId, “Product X”)</t>
<t>YclassId = UUID5(vendorId, “Product Y”)</t>
<t>CommonClassId = UUID5(vendorId, “common core”)</t>
</list></t>
<t>Product X matches against both XclassId and CommonClassId. Product Y matches against both YclassId and CommonClassId.</t>
</section>
<section anchor="example-4-white-labelling" title="Example 4: White-labelling">
<t>Vendor A creates a product A and its firmware. Vendor B sells the product under its own name as Product B with some customised configuration. The vendors create the Class IDs as follows:</t>
<t><list style="symbols">
<t>vendorIdA = UUID5(DNS, “vendor-a.example”)</t>
<t>classIdA = UUID5(vendorIdA, “Product A-Unlabelled”)</t>
<t>vendorIdB = UUID5(DNS, “vendor-b.example”)</t>
<t>classIdB = UUID5(vendorIdB, “Product B”)</t>
</list></t>
<t>The product will match against each of these class IDs. If Vendor A and Vendor B provide different components for the device, the implementor may choose to make ID matching scoped to each component. Then, the vendorIdA, classIdA match the component ID supplied by Vendor A, and the vendorIdB, classIdB match the component ID supplied by Vendor B.</t>
</section>
</section>
<section anchor="element-precursor-digest" title="Precursor Image Digest Condition">
<t>This element provides information about the payload that needs to be present on the device for an update to apply. This may, for example, be the case with differential updates.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-sec-authentic-precursor">REQ.SEC.AUTH.PRECURSOR</xref></t>
</section>
<section anchor="element-required-version" title="Required Image Version List">
<t>Payloads may only be applied to a specific firmware version or firmware versions. For example, a payload containing a differential update may be applied only to a specific firmware version.</t>
<t>When a payload applies to multiple versions of a firmware, the required image version list specifies which firmware versions must be present for the update to be applied. This allows the update author to target specific versions of firmware for an update, while excluding those to which it should not or cannot be applied.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-img-versions">REQ.USE.IMG.VERSIONS</xref></t>
</section>
<section anchor="manifest-element-expiration" title="Expiration Time">
<t>This element tells a device the time at which the manifest expires and should no longer be used. This element should be used where a secure source of time is provided and firmware is intended to expire predictably. This element may also be displayed (e.g. via an app) for user confirmation since users typically have a reliable knowledge of the date.</t>
<t>Special consideration is required for end-of-life if a firmware will not be updated again, for example if a business stops issuing updates to a device. In this case the last valid firmware should not have an expiration time.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-sec-exp">REQ.SEC.EXP</xref></t>
</section>
<section anchor="manifest-element-format" title="Payload Format">
<t>This element describes the payload format within the signed metadata. It is used to enable devices to decode payloads correctly.</t>
<t>This element is REQUIRED.</t>
<t>Implements: <xref target="req-sec-authentic-image-type">REQ.SEC.AUTH.IMG_TYPE</xref>, <xref target="req-use-img-format">REQ.USE.IMG.FORMAT</xref></t>
</section>
<section anchor="manifest-element-processing-steps" title="Processing Steps">
<t>A representation of the Processing Steps required to decode a payload, in particular those that are compressed, packed, or encrypted. The representation must describe which algorithms are used and must convey any additional parameters required by those algorithms.</t>
<t>A Processing Step may indicate the expected digest of the payload after the processing is complete.</t>
<t>This element is RECOMMENDED.</t>
<t>Implements: <xref target="req-use-img-nested">REQ.USE.IMG.NESTED</xref></t>
</section>
<section anchor="maniest-element-storage-location" title="Storage Location">
<t>This element tells the device where to store a payload within a given component. The device can use this to establish which permissions are necessary and the physical storage location to use.</t>
<t>This element is REQUIRED.</t>
<t>Implements: <xref target="req-sec-authentic-image-location">REQ.SEC.AUTH.IMG_LOC</xref></t>
<section anchor="example-1-two-storage-locations" title="Example 1: Two Storage Locations">
<t>A device supports two components: an OS and an application. These components can be updated independently, expressing dependencies to ensure compatibility between the components. The Author chooses two storage identifiers:</t>
<t><list style="symbols">
<t>“OS”</t>
<t>“APP”</t>
</list></t>
</section>
<section anchor="example-2-file-system" title="Example 2: File System">
<t>A device supports a full-featured filesystem. The Author chooses to use the storage identifier as the path at which to install the payload. The payload may be a tarball, in which case, it unpacks the tarball into the specified path.</t>
</section>
<section anchor="example-3-flash-memory" title="Example 3: Flash Memory">
<t>A device supports flash memory. The Author chooses to make the storage identifier the offset where the image should be written.</t>
</section>
</section>
<section anchor="manifest-element-component-identifier" title="Component Identifier">
<t>In a device with more than one storage subsystem, a storage identifier is insufficient to identify where and how to store a payload. To resolve this, a component identifier indicates to which part of the storage subsystem the payload shall be placed.</t>
<t>A serialization may choose to combine Component Identifier and <xref target="maniest-element-storage-location">Storage Location</xref>.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-mfst-component">REQ.USE.MFST.COMPONENT</xref></t>
</section>
<section anchor="manifest-element-payload-indicator" title="Payload Indicator">
<t>This element provides the information required for the device to acquire the payload. This functionality is only needed when the target device does not intrinsically know where to find the payload.</t>
<t>This can be encoded in several ways:</t>
<t><list style="symbols">
<t>One URI</t>
<t>A list of URIs</t>
<t>A prioritised list of URIs</t>
<t>A list of signed URIs</t>
</list></t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-sec-authenticated-remote-payload">REQ.SEC.AUTH.REMOTE_LOC</xref></t>
</section>
<section anchor="manifest-element-payload-digest" title="Payload Digests">
<t>This element contains one or more digests of one or more payloads. This allows the target device to ensure authenticity of the payload(s) when combined with the <xref target="manifest-element-signature">Signature</xref> element. A manifest format must provide a mechanism to select one payload from a list based on system parameters, such as Execute-In-Place Installation Address.</t>
<t>This element is REQUIRED. Support for more than one digest is OPTIONAL.</t>
<t>Implements: <xref target="req-sec-authentic">REQ.SEC.AUTHENTIC</xref>, <xref target="req-use-img-select">REQ.USE.IMG.SELECT</xref></t>
</section>
<section anchor="manifest-element-size" title="Size">
<t>The size of the payload in bytes, which informs the target device how big of a payload to expect. Without it, devices are exposed to some classes of denial of service attack.</t>
<t>This element is REQUIRED.</t>
<t>Implements: <xref target="req-sec-authentic-execution">REQ.SEC.AUTH.EXEC</xref></t>
</section>
<section anchor="manifest-element-signature" title="Manifest Envelope Element: Signature">
<t>The Signature element contains all the information necessary to protect the contents of the manifest against modification and to offer authentication of the signer. Because the Signature element authenticates the manifest, it cannot be contained within the manifest. Instead, the manifest is either contained within the signature element, or the signature element is a member of the Manifest Envelope and bundled with the manifest.</t>
<t>The Signature element represents the foundation of all security properties of the manifest. Manifests, which are included as dependencies by another manifests, should include a signature so that the recipient can distinguish between different actors with different permissions.</t>
<t>The Signature element must support multiple signers and multiple signing algorithms. A manifest format may allow multiple manifests to be covered by a single Signature element.</t>
<t>This element is REQUIRED in non-dependency manifests.</t>
<t>Implements: <xref target="req-sec-authentic">REQ.SEC.AUTHENTIC</xref>, <xref target="req-sec-rights">REQ.SEC.RIGHTS</xref>, <xref target="req-use-mfst-multi-auth">REQ.USE.MFST.MULTI_AUTH</xref></t>
</section>
<section anchor="manifest-element-additional-install-info" title="Additional Installation Instructions">
<t>Additional installation instructions are machine-readable commands the device should execute when processing the manifest. This information is distinct from the information necessary to process a payload. Additional installation instructions include information such as update timing (for example, install only on Sunday, at 0200), procedural considerations (for example, shut down the equipment under control before executing the update), pre- and post-installation steps (for example, run a script). Other installation instructions could include requesting user confirmation before installing.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-mfst-pre-check">REQ.USE.MFST.PRE_CHECK</xref></t>
</section>
<section anchor="manifest-element-text" title="Manifest text information">
<t>Textual information pertaining to the update described by the manifest. This information is for human consumption only. It MUST NOT be the basis of any decision made by the recipient.</t>
<t>Implements: <xref target="req-use-mfst-text">REQ.USE.MFST.TEXT</xref></t>
</section>
<section anchor="manifest-element-aliases" title="Aliases">
<t>A mechanism for a manifest to augment or replace URIs or URI lists defined by one or more of its dependencies.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-mfst-override">REQ.USE.MFST.OVERRIDE_REMOTE</xref></t>
</section>
<section anchor="manifest-element-dependencies" title="Dependencies">
<t>A list of other manifests that are required by the current manifest. Manifests are identified an unambiguous way, such as a cryptographic digest.</t>
<t>This element is REQUIRED to support deployments that include both multiple authorities and multiple payloads.</t>
<t>Implements: <xref target="req-use-mfst-component">REQ.USE.MFST.COMPONENT</xref></t>
</section>
<section anchor="manifest-element-encryption-wrapper" title="Encryption Wrapper">
<t>Encrypting firmware images requires symmetric content encryption keys. The encryption wrapper provides the information needed for a device to obtain or locate a key that it uses to decrypt the firmware.</t>
<t>This element is REQUIRED for encrypted payloads.</t>
<t>Implements: <xref target="req-sec-image-confidentiality">REQ.SEC.IMG.CONFIDENTIALITY</xref></t>
</section>
<section anchor="manifest-element-xip-address" title="XIP Address">
<t>In order to support execute in place (XIP) systems with multiple possible base addresses, it is necessary to specify which address the payload is linked for.</t>
<t>For example a microcontroller may have a simple bootloader that chooses one of two images to boot. That microcontroller then needs to choose one of two firmware images to install, based on which of its two images is older.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-img-select">REQ.USE.IMG.SELECT</xref></t>
</section>
<section anchor="manifest-element-load-metadata" title="Load-time Metadata">
<t>Load-time metadata provides the device with information that it needs in order to load one or more images. This metadata may include any of:</t>
<t><list style="symbols">
<t>the source (e.g. non-volatile storage)</t>
<t>the destination (e.g. an address in RAM)</t>
<t>cryptographic information</t>
<t>decompression information</t>
<t>unpacking information</t>
</list></t>
<t>Typically, loading is done by copying an image from its permanent storage location into its active use location. The metadata allows operations such as decryption, decompression, and unpacking to be performed during that copy.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-load">REQ.USE.LOAD</xref></t>
</section>
<section anchor="manifest-element-exec-metadata" title="Run-time metadata">
<t>Run-time metadata provides the device with any extra information needed to boot the device. This may include the entry-point of an XIP image or the kernel command-line to boot a Linux image.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-exec">REQ.USE.EXEC</xref></t>
</section>
<section anchor="manifest-element-payload" title="Payload">
<t>The Payload element is contained within the manifest or manifest envelope and enables the manifest and payload to be delivered simultaneously. This is used for delivering small payloads, such as cryptographic keys or configuration data.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-payload">REQ.USE.PAYLOAD</xref></t>
</section>
<section anchor="manifest-element-key-claims" title="Manifest Envelope Element: Delegation Chain">
<t>The delegation chain offers enhanced authorization functionality via authorization tokens, such as CBOR Web Tokens <xref target="RFC8392"/> with Proof of Possession Key Semantics <xref target="RFC8747"/>. Each token itself is protected and does not require another layer of protection. Each authorization token typically includes a public key or a public key fingerprint, however this is dependent on the tokens used. Each token MAY include additional metadata, such as key usage information. Because the delegation chain is needed to verify the signature, it must be placed in the Manifest Envelope, rather than the Manifest.</t>
<t>The first token in any delegation chain MUST be autheticated by the recipient’s Trust Anchor. Each subsequent token MUST be authenticated using the previous token. This allows a recipient to discard each antecedent token after it has authenticated the subsequent token. The final token MUST enable authentication of the manifest. More than one delegation chain MAY be used if more than one signature is used. Note that no restriction is placed on the encoding order of these tokens, the order of elements is logical only.</t>
<t>This element is OPTIONAL.</t>
<t>Implements: <xref target="req-use-delegation">REQ.USE.DELEGATION</xref>, <xref target="req-sec-key-rotation">REQ.SEC.KEY.ROTATION</xref></t>
</section>
</section>
<section anchor="design-motivation" title="Security Considerations">
<t>The following sub-sections describe the threat model, user stories, security requirements, and usability requirements. This section also provides the motivations for each of the manifest information elements.</t>
<t>Note that it is worthwhile to recall that a firmware update is, by definition, remote code execution. Hence, if a device is configured to trust an entity to provide firmware, it trusts this entity to do the “right thing”. Many classes of attacks can be mitigated by verifying that a firmware update came from a trusted party and that no rollback is taking place. However, if the trusted entity has been compromised and distributes attacker-provided firmware to devices then the possibilities for deference are limited.</t>
<section anchor="threat-model" title="Threat Model">
<t>The following sub-sections aim to provide information about the threats that were considered, the security requirements that are derived from those threats and the fields that permit implementation of the security requirements. This model uses the S.T.R.I.D.E. <xref target="STRIDE"/> approach. Each threat is classified according to:</t>
<t><list style="symbols">
<t>Spoofing identity</t>
<t>Tampering with data</t>
<t>Repudiation</t>
<t>Information disclosure</t>
<t>Denial of service</t>
<t>Elevation of privilege</t>
</list></t>
<t>This threat model only covers elements related to the transport of firmware updates. It explicitly does not cover threats outside of the transport of firmware updates. For example, threats to an IoT device due to physical access are out of scope.</t>
</section>
<section anchor="threat-descriptions" title="Threat Descriptions">
<t>Many of the threats detailed in this section contain a “threat escalation” description. This explains how the described threat might fit together with other threats and produce a high severity threat. This is important because some of the described threats may seem low severity but could be used with others to construct a high severity compromise.</t>
<section anchor="threat-expired" title="THREAT.IMG.EXPIRED: Old Firmware">
<t>Classification: Elevation of Privilege</t>
<t>An attacker sends an old, but valid manifest with an old, but valid firmware image to a device. If there is a known vulnerability in the provided firmware image, this may allow an attacker to exploit the vulnerability and gain control of the device.</t>
<t>Threat Escalation: If the attacker is able to exploit the known vulnerability, then this threat can be escalated to ALL TYPES.</t>
<t>Mitigated by: <xref target="req-sec-sequence">REQ.SEC.SEQUENCE</xref></t>
</section>
<section anchor="threat-expired-offline" title="THREAT.IMG.EXPIRED.OFFLINE : Offline device + Old Firmware">
<t>Classification: Elevation of Privilege</t>
<t>An attacker targets a device that has been offline for a long time and runs an old firmware version. The attacker sends an old, but valid manifest to a device with an old, but valid firmware image. The attacker-provided firmware is newer than the installed one but older than the most recently available firmware. If there is a known vulnerability in the provided firmware image then this may allow an attacker to gain control of a device. Because the device has been offline for a long time, it is unaware of any new updates. As such it will treat the old manifest as the most current.</t>
<t>The exact mitigation for this threat depends on where the threat comes from. This requires careful consideration by the implementor. If the threat is from a network actor, including an on-path attacker, or an intruder into a management system, then a user confirmation can mitigate this attack, simply by displaying an expiration date and requesting confirmation. On the other hand, if the user is the attacker, then an online confirmation system (for example a trusted timestamp server) can be used as a mitigation system.</t>
<t>Threat Escalation: If the attacker is able to exploit the known vulnerability, then this threat can be escalated to ALL TYPES.</t>
<t>Mitigated by: <xref target="req-sec-exp">REQ.SEC.EXP</xref>, <xref target="req-use-mfst-pre-check">REQ.USE.MFST.PRE_CHECK</xref>,</t>
</section>
<section anchor="threat-incompatible" title="THREAT.IMG.INCOMPATIBLE: Mismatched Firmware">
<t>Classification: Denial of Service</t>
<t>An attacker sends a valid firmware image, for the wrong type of device, signed by an actor with firmware installation permission on both types of device. The firmware is verified by the device positively because it is signed by an actor with the appropriate permission. This could have wide-ranging consequences. For devices that are similar, it could cause minor breakage, or expose security vulnerabilities. For devices that are very different, it is likely to render devices inoperable.</t>
<t>Mitigated by: <xref target="req-sec-compatible">REQ.SEC.COMPATIBLE</xref></t>
<t>For example, suppose that two vendors, Vendor A and Vendor B, adopt the same trade name in different geographic regions, and they both make products with the same names, or product name matching is not used. This causes firmware from Vendor A to match devices from Vendor B.</t>
<t>If the vendors are the firmware authorities, then devices from Vendor A will reject images signed by Vendor B since they use different credentials. However, if both devices trust the same Author, then, devices from Vendor A could install firmware intended for devices from Vendor B.</t>
</section>
<section anchor="threat-img-format" title="THREAT.IMG.FORMAT: The target device misinterprets the type of payload">
<t>Classification: Denial of Service</t>
<t>If a device misinterprets the format of the firmware image, it may cause a device to install a firmware image incorrectly. An incorrectly installed firmware image would likely cause the device to stop functioning.</t>
<t>Threat Escalation: An attacker that can cause a device to misinterpret the received firmware image may gain elevation of privilege and potentially expand this to all types of threat.</t>
<t>Mitigated by: <xref target="req-sec-authentic-image-type">REQ.SEC.AUTH.IMG_TYPE</xref></t>
</section>
<section anchor="threat-img-location" title="THREAT.IMG.LOCATION: The target device installs the payload to the wrong location">
<t>Classification: Denial of Service</t>
<t>If a device installs a firmware image to the wrong location on the device, then it is likely to break. For example, a firmware image installed as an application could cause a device and/or an application to stop functioning.</t>
<t>Threat Escalation: An attacker that can cause a device to misinterpret the received code may gain elevation of privilege and potentially expand this to all types of threat.</t>
<t>Mitigated by: <xref target="req-sec-authentic-image-location">REQ.SEC.AUTH.IMG_LOC</xref></t>
</section>
<section anchor="threat-net-redirect" title="THREAT.NET.REDIRECT: Redirection to inauthentic payload hosting">
<t>Classification: Denial of Service</t>
<t>If a device is tricked into fetching a payload for an attacker controlled site, the attacker may send corrupted payloads to devices.</t>
<t>Mitigated by: <xref target="req-sec-authenticated-remote-payload">REQ.SEC.AUTH.REMOTE_LOC</xref></t>
</section>
<section anchor="threat-net-onpath" title="THREAT.NET.ONPATH: Traffic interception">
<t>Classification: Spoofing Identity, Tampering with Data</t>
<t>An attacker intercepts all traffic to and from a device. The attacker can monitor or modify any data sent to or received from the device. This can take the form of: manifests, payloads, status reports, and capability reports being modified or not delivered to the intended recipient. It can also take the form of analysis of data sent to or from the device, either in content, size, or frequency.</t>
<t>Mitigated by: <xref target="req-sec-authentic">REQ.SEC.AUTHENTIC</xref>, <xref target="req-sec-image-confidentiality">REQ.SEC.IMG.CONFIDENTIALITY</xref>, <xref target="req-sec-authenticated-remote-payload">REQ.SEC.AUTH.REMOTE_LOC</xref>, <xref target="req-sec-mfst-confidentiality">REQ.SEC.MFST.CONFIDENTIALITY</xref>, <xref target="req-sec-reporting">REQ.SEC.REPORTING</xref></t>
</section>
<section anchor="threat-image-replacement" title="THREAT.IMG.REPLACE: Payload Replacement">
<t>Classification: Elevation of Privilege</t>
<t>An attacker replaces a newly downloaded firmware after a device finishes verifying a manifest. This could cause the device to execute the attacker’s code. This attack likely requires physical access to the device. However, it is possible that this attack is carried out in combination with another threat that allows remote execution. This is a typical Time Of Check/Time Of Use (TICTOC) attack.</t>
<t>Threat Escalation: If the attacker is able to exploit a known vulnerability, or if the attacker can supply their own firmware, then this threat can be escalated to ALL TYPES.</t>
<t>Mitigated by: <xref target="req-sec-authentic-execution">REQ.SEC.AUTH.EXEC</xref></t>
</section>
<section anchor="threat-img-unauthenticated" title="THREAT.IMG.NON_AUTH: Unauthenticated Images">
<t>Classification: Elevation of Privilege / All Types</t>
<t>If an attacker can install their firmware on a device, for example by manipulating either payload or metadata, then they have complete control of the device.</t>
<t>Mitigated by: <xref target="req-sec-authentic">REQ.SEC.AUTHENTIC</xref></t>
</section>
<section anchor="threat-upd-wrong-precursor" title="THREAT.UPD.WRONG_PRECURSOR: Unexpected Precursor images">
<t>Classification: Denial of Service / All Types</t>
<t>Modifications of payloads and metadata allow an attacker to introduce a number of denial of service attacks. Below are some examples.</t>
<t>An attacker sends a valid, current manifest to a device that has an unexpected precursor image. If a payload format requires a precursor image (for example, delta updates) and that precursor image is not available on the target device, it could cause the update to break.</t>
<t>An attacker that can cause a device to install a payload against the wrong precursor image could gain elevation of privilege and potentially expand this to all types of threat. However, it is unlikely that a valid differential update applied to an incorrect precursor would result in a functional, but vulnerable firmware.</t>
<t>Mitigated by: <xref target="req-sec-authentic-precursor">REQ.SEC.AUTH.PRECURSOR</xref></t>
</section>
<section anchor="threat-upd-unapproved" title="THREAT.UPD.UNAPPROVED: Unapproved Firmware">
<t>Classification: Denial of Service, Elevation of Privilege</t>
<t>This threat can appear in several ways, however it is ultimately about ensuring that devices retain the behaviour required by their owner, or operator. The owner or operator of a device typically requires that the device maintain certain features, functions, capabilities, behaviours, or interoperability constraints (more generally, behaviour). If these requirements are broken, then a device will not fulfill its purpose. Therefore, if any party other than the device’s owner or the owner’s contracted Device Operator has the ability to modify device behaviour without approval, then this constitutes an elevation of privilege.</t>
<t>Similarly, a Network Operator may require that devices behave in a particular way in order to maintain the integrity of the network. If devices behaviour on a network can be modified without the approval of the Network Operator, then this constitutes an elevation of privilege with respect to the network.</t>
<t>For example, if the owner of a device has purchased that device because of features A, B, and C, and a firmware update is issued by the manufacturer, which removes feature A, then the device may not fulfill the owner’s requirements any more. In certain circumstances, this can cause significantly greater threats. Suppose that feature A is used to implement a safety-critical system, whether the manufacturer intended this behaviour or not. When unapproved firmware is installed, the system may become unsafe.</t>
<t>In a second example, the owner or operator of a system of two or more interoperating devices needs to approve firmware for their system in order to ensure interoperability with other devices in the system. If the firmware is not qualified, the system as a whole may not work. Therefore, if a device installs firmware without the approval of the device owner or operator, this is a threat to devices or the system as a whole.</t>
<t>Similarly, the operator of a network may need to approve firmware for devices attached to the network in order to ensure favourable operating conditions within the network. If the firmware is not qualified, it may degrade the performance of the network. Therefore, if a device installs firmware without the approval of the Network Operator, this is a threat to the network itself.</t>
<t>Threat Escalation: If the firmware expects configuration that is present in devices deployed in Network A, but not in devices deployed in Network B, then the device may experience degraded security, leading to threats of All Types.</t>
<t>Mitigated by: <xref target="req-sec-rights">REQ.SEC.RIGHTS</xref>, <xref target="req-sec-access-control">REQ.SEC.ACCESS_CONTROL</xref></t>
<section anchor="example-1-multiple-network-operators-with-a-single-device-operator" title="Example 1: Multiple Network Operators with a Single Device Operator">
<t>In this example, assume that Device Operators expect the rights to create firmware but that Network Operators expect the rights to qualify firmware as fit-for-purpose on their networks. Additionally, assume that Device Operators manage devices that can be deployed on any network, including Network A and B in our example.</t>
<t>An attacker may obtain a manifest for a device on Network A. Then, this attacker sends that manifest to a device on Network B. Because Network A and Network B are under control of different Operators, and the firmware for a device on Network A has not been qualified to be deployed on Network B, the target device on Network B is now in violation of the Operator B’s policy and may be disabled by this unqualified, but signed firmware.</t>
<t>This is a denial of service because it can render devices inoperable. This is an elevation of privilege because it allows the attacker to make installation decisions that should be made by the Operator.</t>
</section>
<section anchor="example-2-single-network-operator-with-multiple-device-operators" title="Example 2: Single Network Operator with Multiple Device Operators">
<t>Multiple devices that interoperate are used on the same network and communicate with each other. Some devices are manufactured and managed by Device Operator A and other devices by Device Operator B. A new firmware is released by Device Operator A that breaks compatibility with devices from Device Operator B. An attacker sends the new firmware to the devices managed by Device Operator A without approval of the Network Operator. This breaks the behaviour of the larger system causing denial of service and possibly other threats. Where the network is a distributed SCADA system, this could cause misbehaviour of the process that is under control.</t>
</section>
</section>
<section anchor="threat-img-disclosure" title="THREAT.IMG.DISCLOSURE: Reverse Engineering Of Firmware Image for Vulnerability Analysis">
<t>Classification: All Types</t>
<t>An attacker wants to mount an attack on an IoT device. To prepare the attack he or she retrieves the provided firmware image and performs reverse engineering of the firmware image to analyze it for specific vulnerabilities.</t>
<t>Mitigated by: <xref target="req-sec-image-confidentiality">REQ.SEC.IMG.CONFIDENTIALITY</xref></t>
</section>
<section anchor="threat-mfst-override" title="THREAT.MFST.OVERRIDE: Overriding Critical Manifest Elements">
<t>Classification: Elevation of Privilege</t>
<t>An authorized actor, but not the Author, uses an override mechanism (<xref target="user-story-override">USER_STORY.OVERRIDE</xref>) to change an information element in a manifest signed by the Author. For example, if the authorized actor overrides the digest and URI of the payload, the actor can replace the entire payload with a payload of their choice.</t>
<t>Threat Escalation: By overriding elements such as payload installation instructions or firmware digest, this threat can be escalated to all types.</t>
<t>Mitigated by: <xref target="req-sec-access-control">REQ.SEC.ACCESS_CONTROL</xref></t>
</section>
<section anchor="threat-mfst-exposure" title="THREAT.MFST.EXPOSURE: Confidential Manifest Element Exposure">
<t>Classification: Information Disclosure</t>
<t>A third party may be able to extract sensitive information from the manifest.</t>
<t>Mitigated by: <xref target="req-sec-mfst-confidentiality">REQ.SEC.MFST.CONFIDENTIALITY</xref></t>
</section>
<section anchor="threat-img-extra" title="THREAT.IMG.EXTRA: Extra data after image">
<t>Classification: All Types</t>
<t>If a third party modifies the image so that it contains extra code after a valid, authentic image, that third party can then use their own code in order to make better use of an existing vulnerability.</t>
<t>Mitigated by: <xref target="req-sec-img-complete-digest">REQ.SEC.IMG.COMPLETE_DIGEST</xref></t>
</section>
<section anchor="threat-key-exposure" title="THREAT.KEY.EXPOSURE: Exposure of signing keys">
<t>Classification: All Types</t>
<t>If a third party obtains a key or even indirect access to a key, for example in an hardware security module (HSM), then they can perform the same actions as the legitimate owner of the key. If the key is trusted for firmware update, then the third party can perform firmware updates as though they were the legitimate owner of the key.</t>
<t>For example, if manifest signing is performed on a server connected to the internet, an attacker may compromise the server and then be able to sign manifests, even if the keys for manifest signing are held in an HSM that is accessed by the server.</t>
<t>Mitigated by: <xref target="req-sec-key-protection">REQ.SEC.KEY.PROTECTION</xref>, <xref target="req-sec-key-rotation">REQ.SEC.KEY.ROTATION</xref></t>
</section>
<section anchor="threat-mfst-modification" title="THREAT.MFST.MODIFICATION: Modification of manifest or payload prior to signing">
<t>Classification: All Types</t>
<t>If an attacker can alter a manifest or payload before it is signed, they can perform all the same actions as the manifest author. This allows the attacker to deploy firmware updates to any devices that trust the manifest author. If an attacker can modify the code of a payload before the corresponding manifest is created, they can insert their own code. If an attacker can modify the manifest before it is signed, they can redirect the manifest to their own payload.</t>
<t>For example, the attacker deploys malware to the developer’s computer or signing service that watches manifest creation activities and inserts code into any binary that is referenced by a manifest.</t>
<t>For example, the attacker deploys malware to the developer’s computer or signing service that replaces the referenced binary (digest) and URI with the attacker’s binary (digest) and URI.</t>
<t>Mitigated by: <xref target="req-sec-mfst-check">REQ.SEC.MFST.CHECK</xref>, <xref target="req-sec-mfst-trusted">REQ.SEC.MFST.TRUSTED</xref></t>
</section>
<section anchor="threat-mfst-toctou" title="THREAT.MFST.TOCTOU: Modification of manifest between authentication and use">
<t>Classification: All Types</t>
<t>If an attacker can modify a manifest after it is authenticated (Time Of Check) but before it is used (Time Of Use), then the attacker can place any content whatsoever in the manifest.</t>
<t>Mitigated by: <xref target="req-sec-mfst-const">REQ.SEC.MFST.CONST</xref></t>
</section>
</section>
<section anchor="security-requirements" title="Security Requirements">
<t>The security requirements here are a set of policies that mitigate the threats described in <xref target="threat-model"/>.</t>
<section anchor="req-sec-sequence" title="REQ.SEC.SEQUENCE: Monotonic Sequence Numbers">
<t>Only an actor with firmware installation authority is permitted to decide when device firmware can be installed. To enforce this rule, manifests MUST contain monotonically increasing sequence numbers. Manifests may use UTC epoch timestamps to coordinate monotonically increasing sequence numbers across many actors in many locations. If UTC epoch timestamps are used, they must not be treated as times, they must be treated only as sequence numbers. Devices must reject manifests with sequence numbers smaller than any onboard sequence number, i.e. there is no sequence number roll over.</t>
<t>Note: This is not a firmware version field. It is a manifest sequence number. A firmware version may be rolled back by creating a new manifest for the old firmware version with a later sequence number.</t>
<t>Mitigates: <xref target="threat-expired">THREAT.IMG.EXPIRED</xref></t>
<t>Implemented by: <xref target="element-sequence-number">Monotonic Sequence Number</xref></t>
</section>
<section anchor="req-sec-compatible" title="REQ.SEC.COMPATIBLE: Vendor, Device-type Identifiers">
<t>Devices MUST only apply firmware that is intended for them. Devices must know that a given update applies to their vendor, model, hardware revision, and software revision. Human-readable identifiers are often error-prone in this regard, so unique identifiers should be used instead.</t>
<t>Mitigates: <xref target="threat-incompatible">THREAT.IMG.INCOMPATIBLE</xref></t>
<t>Implemented by: <xref target="element-vendor-id">Vendor ID Condition</xref>, <xref target="element-class-id">Class ID Condition</xref></t>
</section>
<section anchor="req-sec-exp" title="REQ.SEC.EXP: Expiration Time">
<t>A firmware manifest MAY expire after a given time and devices may have a secure clock (local or remote). If a secure clock is provided and the Firmware manifest has an expiration timestamp, the device must reject the manifest if current time is later than the expiration time.</t>
<t>Special consideration is required for end-of-life in case device will not be updated again, for example if a business stops issuing updates for a device. The last valid firmware should not have an expiration time.</t>
<t>If a device has a flawed time source (either local or remote), an old update can be deployed as new.</t>
<t>Mitigates: <xref target="threat-expired-offline">THREAT.IMG.EXPIRED.OFFLINE</xref></t>
<t>Implemented by: <xref target="manifest-element-expiration">Expiration Time</xref></t>
</section>
<section anchor="req-sec-authentic" title="REQ.SEC.AUTHENTIC: Cryptographic Authenticity">
<t>The authenticity of an update MUST be demonstrable. Typically, this means that updates must be digitally signed. Because the manifest contains information about how to install the update, the manifest’s authenticity must also be demonstrable. To reduce the overhead required for validation, the manifest contains the cryptographic digest of the firmware image, rather than a second digital signature. The authenticity of the manifest can be verified with a digital signature or Message Authentication Code. The authenticity of the firmware image is tied to the manifest by the use of a cryptographic digest of the firmware image.</t>
<t>Mitigates: <xref target="threat-img-unauthenticated">THREAT.IMG.NON_AUTH</xref>, <xref target="threat-net-onpath">THREAT.NET.ONPATH</xref></t>
<t>Implemented by: <xref target="manifest-element-signature">Signature</xref>, <xref target="manifest-element-payload-digest">Payload Digest</xref></t>
</section>
<section anchor="req-sec-authentic-image-type" title="REQ.SEC.AUTH.IMG_TYPE: Authenticated Payload Type">
<t>The type of payload MUST be authenticated. For example, the target must know whether the payload is XIP firmware, a loadable module, or configuration data.</t>
<t>Mitigates: <xref target="threat-img-format">THREAT.IMG.FORMAT</xref></t>
<t>Implemented by: <xref target="manifest-element-format">Payload Format</xref>, <xref target="manifest-element-signature">Signature</xref></t>
</section>
<section anchor="req-sec-authentic-image-location" title="Security Requirement REQ.SEC.AUTH.IMG_LOC: Authenticated Storage Location">
<t>The location on the target where the payload is to be stored MUST be authenticated.</t>
<t>Mitigates: <xref target="threat-img-location">THREAT.IMG.LOCATION</xref></t>
<t>Implemented by: <xref target="maniest-element-storage-location">Storage Location</xref></t>
</section>
<section anchor="req-sec-authenticated-remote-payload" title="REQ.SEC.AUTH.REMOTE_LOC: Authenticated Remote Payload">
<t>The location where a target should find a payload MUST be authenticated. Remote resources need to receive an equal amount of cryptographic protection as the manifest itself, when dereferencing URIs. The security considerations of Uniform Resource Identifiers (URIs) are applicable <xref target="RFC3986"/>.</t>
<t>Mitigates: <xref target="threat-net-redirect">THREAT.NET.REDIRECT</xref>, <xref target="threat-net-onpath">THREAT.NET.ONPATH</xref></t>
<t>Implemented by: <xref target="manifest-element-payload-indicator">Payload Indicator</xref></t>
</section>
<section anchor="req-sec-authentic-execution" title="REQ.SEC.AUTH.EXEC: Secure Execution">
<t>The target SHOULD verify firmware at time of boot. This requires authenticated payload size, and digest.</t>
<t>Mitigates: <xref target="threat-image-replacement">THREAT.IMG.REPLACE</xref></t>
<t>Implemented by: <xref target="manifest-element-payload-digest">Payload Digest</xref>, <xref target="manifest-element-size">Size</xref></t>
</section>
<section anchor="req-sec-authentic-precursor" title="REQ.SEC.AUTH.PRECURSOR: Authenticated precursor images">
<t>If an update uses a differential compression method, it MUST specify the digest of the precursor image and that digest MUST be authenticated.</t>
<t>Mitigates: <xref target="threat-upd-wrong-precursor">THREAT.UPD.WRONG_PRECURSOR</xref></t>
<t>Implemented by: <xref target="element-precursor-digest">Precursor Image Digest</xref></t>
</section>
<section anchor="req-sec-authentic-compatibility" title="REQ.SEC.AUTH.COMPATIBILITY: Authenticated Vendor and Class IDs">
<t>The identifiers that specify firmware compatibility MUST be authenticated to ensure that only compatible firmware is installed on a target device.</t>
<t>Mitigates: <xref target="threat-incompatible">THREAT.IMG.INCOMPATIBLE</xref></t>
<t>Implemented By: <xref target="element-vendor-id">Vendor ID Condition</xref>, <xref target="element-class-id">Class ID Condition</xref></t>
</section>
<section anchor="req-sec-rights" title="REQ.SEC.RIGHTS: Rights Require Authenticity">
<t>If a device grants different rights to different actors, exercising those rights MUST be accompanied by proof of those rights, in the form of proof of authenticity. Authenticity mechanisms, such as those required in <xref target="req-sec-authentic">REQ.SEC.AUTHENTIC</xref>, can be used to prove authenticity.</t>
<t>For example, if a device has a policy that requires that firmware have both an Authorship right and a Qualification right and if that device grants Authorship and Qualification rights to different parties, such as a Device Operator and a Network Operator, respectively, then the firmware cannot be installed without proof of rights from both the Device Operator and the Network Operator.</t>
<t>Mitigates: <xref target="threat-upd-unapproved">THREAT.UPD.UNAPPROVED</xref></t>
<t>Implemented by: <xref target="manifest-element-signature">Signature</xref></t>
</section>
<section anchor="req-sec-image-confidentiality" title="REQ.SEC.IMG.CONFIDENTIALITY: Payload Encryption">
<t>The manifest information model MUST enable encrypted payloads. Encryption helps to prevent third parties, including attackers, from reading the content of the firmware image. This can protect against confidential information disclosures and discovery of vulnerabilities through reverse engineering. Therefore the manifest must convey the information required to allow an intended recipient to decrypt an encrypted payload.</t>
<t>Mitigates: <xref target="threat-img-disclosure">THREAT.IMG.DISCLOSURE</xref>, <xref target="threat-net-onpath">THREAT.NET.ONPATH</xref></t>
<t>Implemented by: <xref target="manifest-element-encryption-wrapper">Encryption Wrapper</xref></t>
</section>
<section anchor="req-sec-access-control" title="REQ.SEC.ACCESS_CONTROL: Access Control">
<t>If a device grants different rights to different actors, then an exercise of those rights MUST be validated against a list of rights for the actor. This typically takes the form of an Access Control List (ACL). ACLs are applied to two scenarios:</t>
<t><list style="numbers">
<t>An ACL decides which elements of the manifest may be overridden and by which actors.</t>
<t>An ACL decides which component identifier/storage identifier pairs can be written by which actors.</t>
</list></t>
<t>Mitigates: <xref target="threat-mfst-override">THREAT.MFST.OVERRIDE</xref>, <xref target="threat-upd-unapproved">THREAT.UPD.UNAPPROVED</xref></t>
<t>Implemented by: Client-side code, not specified in manifest.</t>
</section>
<section anchor="req-sec-mfst-confidentiality" title="REQ.SEC.MFST.CONFIDENTIALITY: Encrypted Manifests">
<t>A manifest format MUST allow encryption of selected parts of the manifest or encryption of the entire manifest to prevent sensitive content of the firmware metadata to be leaked.</t>
<t>Mitigates: <xref target="threat-mfst-exposure">THREAT.MFST.EXPOSURE</xref>, <xref target="threat-net-onpath">THREAT.NET.ONPATH</xref></t>
<t>Implemented by: Manifest Encryption Wrapper / Transport Security</t>
</section>
<section anchor="req-sec-img-complete-digest" title="REQ.SEC.IMG.COMPLETE_DIGEST: Whole Image Digest">
<t>The digest SHOULD cover all available space in a fixed-size storage location. Variable-size storage locations MUST be restricted to exactly the size of deployed payload. This prevents any data from being distributed without being covered by the digest. For example, XIP microcontrollers typically have fixed-size storage. These devices should deploy a digest that covers the deployed firmware image, concatenated with the default erased value of any remaining space.</t>
<t>Mitigates: <xref target="threat-img-extra">THREAT.IMG.EXTRA</xref></t>
<t>Implemented by: <xref target="manifest-element-payload-digest">Payload Digests</xref></t>
</section>
<section anchor="req-sec-reporting" title="REQ.SEC.REPORTING: Secure Reporting">
<t>Status reports from the device to any remote system MUST be performed over an authenticated, confidential channel in order to prevent modification or spoofing of the reports.</t>
<t>Mitigates: <xref target="threat-net-onpath">THREAT.NET.ONPATH</xref></t>
<t>Implemented by: Transport Security / Manifest format triggering generation of reports</t>
</section>
<section anchor="req-sec-key-protection" title="REQ.SEC.KEY.PROTECTION: Protected storage of signing keys">
<t>Cryptographic keys for signing/authenticating manifests SHOULD be stored in a manner that is inaccessible to networked devices, for example in an HSM, or an air-gapped computer. This protects against an attacker obtaining the keys.</t>
<t>Keys SHOULD be stored in a way that limits the risk of a legitimate, but compromised, entity (such as a server or developer computer) issuing signing requests.</t>
<t>Mitigates: <xref target="threat-key-exposure">THREAT.KEY.EXPOSURE</xref></t>
<t>Implemented by: Hardware-assisted isolation technologies, which are outside the scope of the manifest format.</t>
</section>
<section anchor="req-sec-key-rotation" title="REQ.SEC.KEY.ROTATION: Protected storage of signing keys">
<t>Cryptographic keys for signing/authenticating manifests SHOULD be replaced from time to time. Because it is difficult and risky to replace a Trust Anchor, keys used for signing updates SHOULD be delegates of that Trust Anchor.</t>
<t>If key expiration is performed based on time, then a secure clock is needed. If the time source used by a recipient to check for expiration is flawed, an old signing key can be used as current, which compounds <xref target="threat-key-exposure">THREAT.KEY.EXPOSURE</xref>.</t>
<t>Mitigates: <xref target="threat-key-exposure">THREAT.KEY.EXPOSURE</xref></t>
<t>Implemented by: Secure storage technology, which is a system design/implementation aspect outside the scope of the manifest format.</t>
</section>
<section anchor="req-sec-mfst-check" title="REQ.SEC.MFST.CHECK: Validate manifests prior to deployment">
<t>Manifests SHOULD be verified prior to deployment. This reduces problems that may arise with devices installing firmware images that damage devices unintentionally.</t>
<t>Mitigates: <xref target="threat-mfst-modification">THREAT.MFST.MODIFICATION</xref></t>
<t>Implemented by: Testing infrastructure. While outside the scope of the manifest format, proper testing of low-level software is essential for avoiding unnecessary down-time or worse situations.</t>
</section>
<section anchor="req-sec-mfst-trusted" title="REQ.SEC.MFST.TRUSTED: Construct manifests in a trusted environment">
<t>For high risk deployments, such as large numbers of devices or critical function devices, manifests SHOULD be constructed in an environment that is protected from interference, such as an air-gapped computer. Note that a networked computer connected to an HSM does not fulfill this requirement (see <xref target="threat-mfst-modification">THREAT.MFST.MODIFICATION</xref>).</t>
<t>Mitigates: <xref target="threat-mfst-modification">THREAT.MFST.MODIFICATION</xref></t>
<t>Implemented by: Physical and network security for protecting the environment where firmware updates are prepared to avoid unauthorized access to this infrastructure.</t>
</section>
<section anchor="req-sec-mfst-const" title="REQ.SEC.MFST.CONST: Manifest kept immutable between check and use">
<t>Both the manifest and any data extracted from it MUST be held immutable between its authenticity verification (time of check) and its use (time of use). To make this guarantee, the manifest MUST fit within an internal memory or a secure memory, such as encrypted memory. The recipient SHOULD defend the manifest from tampering by code or hardware resident in the recipient, for example other processes or debuggers.</t>
<t>If an application requires that the manifest is verified before storing it, then this means the manifest MUST fit in RAM.</t>
<t>Mitigates: <xref target="threat-mfst-toctou">THREAT.MFST.TOCTOU</xref></t>
<t>Implemented by: Proper system design with sufficient resources and implementation avoiding TOCTOU attacks.</t>
</section>
</section>
<section anchor="user-stories" title="User Stories">
<t>User stories provide expected use cases. These are used to feed into usability requirements.</t>
<section anchor="user-story-install-instructions" title="USER_STORY.INSTALL.INSTRUCTIONS: Installation Instructions">
<t>As a Device Operator, I want to provide my devices with additional installation instructions so that I can keep process details out of my payload data.</t>
<t>Some installation instructions might be:</t>
<t><list style="symbols">
<t>Use a table of hashes to ensure that each block of the payload is validated before writing.</t>
<t>Do not report progress.</t>
<t>Pre-cache the update, but do not install.</t>
<t>Install the pre-cached update matching this manifest.</t>
<t>Install this update immediately, overriding any long-running tasks.</t>
</list></t>
<t>Satisfied by: <xref target="req-use-mfst-pre-check">REQ.USE.MFST.PRE_CHECK</xref></t>
</section>
<section anchor="user-story-fail-early" title="USER_STORY.MFST.FAIL_EARLY: Fail Early">
<t>As a designer of a resource-constrained IoT device, I want bad updates to fail as early as possible to preserve battery life and limit consumed bandwidth.</t>
<t>Satisfied by: <xref target="req-use-mfst-pre-check">REQ.USE.MFST.PRE_CHECK</xref></t>
</section>
<section anchor="user-story-override" title="USER_STORY.OVERRIDE: Override Non-Critical Manifest Elements">
<t>As a Device Operator, I would like to be able to override the non-critical information in the manifest so that I can control my devices more precisely. The authority to override this information is provided via the installation of a limited trust anchor by another authority.</t>
<t>Some examples of potentially overridable information:</t>
<t><list style="symbols">
<t><xref target="manifest-element-payload-indicator">URIs</xref>: this allows the Device Operator to direct devices to their own infrastructure in order to reduce network load.</t>
<t>Conditions: this allows the Device Operator to pose additional constraints on the installation of the manifest.</t>
<t><xref target="manifest-element-additional-install-info">Directives</xref>: this allows the Device Operator to add more instructions such as time of installation.</t>
<t><xref target="manifest-element-processing-steps">Processing Steps</xref>: If an intermediary performs an action on behalf of a device, it may need to override the processing steps. It is still possible for a device to verify the final content and the result of any processing step that specifies a digest. Some processing steps should be non-overridable.</t>
</list></t>
<t>Satisfied by: <xref target="req-use-mfst-component">REQ.USE.MFST.COMPONENT</xref></t>
</section>
<section anchor="user-story-component" title="USER_STORY.COMPONENT: Component Update">
<t>As a Device Operator, I want to divide my firmware into components, so that I can reduce the size of updates, make different parties responsible for different components, and divide my firmware into frequently updated and infrequently updated components.</t>
<t>Satisfied by: <xref target="req-use-mfst-component">REQ.USE.MFST.COMPONENT</xref></t>
</section>
<section anchor="user-story-multi-auth" title="USER_STORY.MULTI_AUTH: Multiple Authorizations">
<t>As a Device Operator, I want to ensure the quality of a firmware update before installing it, so that I can ensure interoperability of all devices in my product family. I want to restrict the ability to make changes to my devices to require my express approval.</t>
<t>Satisfied by: <xref target="req-use-mfst-multi-auth">REQ.USE.MFST.MULTI_AUTH</xref>, <xref target="req-sec-access-control">REQ.SEC.ACCESS_CONTROL</xref></t>
</section>
<section anchor="user-story-img-format" title="USER_STORY.IMG.FORMAT: Multiple Payload Formats">
<t>As a Device Operator, I want to be able to send multiple payload formats to suit the needs of my update, so that I can optimise the bandwidth used by my devices.</t>
<t>Satisfied by: <xref target="req-use-img-format">REQ.USE.IMG.FORMAT</xref></t>
</section>
<section anchor="user-story-img-confidentiality" title="USER_STORY.IMG.CONFIDENTIALITY: Prevent Confidential Information Disclosures">
<t>As a firmware author, I want to prevent confidential information in the manifest from being disclosed when distributing manifests and firmware images. Confidential information may include information about the device these updates are being applied to as well as information in the firmware image itself.</t>
<t>Satisfied by: <xref target="req-sec-image-confidentiality">REQ.SEC.IMG.CONFIDENTIALITY</xref></t>