3.29. Indicator Class
The Indicator class describes an indicator. An indicator consists of observable features and phenomenon that aid in the forensic or proactive detection of malicious activity and associated metadata. An indicator can be described outright by referencing or composing previously defined indicators or by referencing observables described in the incident report found in this document.
+------------------------+ | Indicator | +------------------------+ | ENUM restriction |<>----------[ IndicatorID ] | STRING ext-restriction |<>--{0..*}--[ AlternativeIndicatorID ] | |<>--{0..*}--[ Description ] | |<>--{0..1}--[ StartTime ] | |<>--{0..1}--[ EndTime ] | |<>--{0..1}--[ Confidence ] | |<>--{0..*}--[ Contact ] | |<>--{0..1}--[ Observable ] | |<>--{0..1}--[ ObservableReference ] | |<>--{0..1}--[ IndicatorExpression ] | |<>--{0..1}--[ IndicatorReference ] | |<>--{0..*}--[ NodeRole ] | |<>--{0..*}--[ AttackPhase ] | |<>--{0..*}--[ Reference ] | |<>--{0..*}--[ AdditionalData ] +------------------------+ Figure 59: The Indicator Class The aggregate classes of the Indicator class are: IndicatorID One. An identifier for this indicator. See Section 3.29.1. AlternativeIndicatorID Zero or more. An alternative identifier for this indicator. See Section 3.29.2. Description Zero or more. ML_STRING. A free-form text description of the indicator. StartTime Zero or one. DATETIME. A timestamp of the start of the time period during which this indicator is valid. EndTime Zero or one. DATETIME. A timestamp of the end of the time period during which this indicator is valid. Confidence Zero or one. An estimate of the confidence in the quality of the indicator. See Section 3.12.5.
Contact Zero or more. Contact information for this indicator. See Section 3.9. Observable Zero or one. An observable feature or phenomenon of this indicator. See Section 3.29.3. ObservableReference Zero or one. A reference to an observable feature or phenomenon defined elsewhere in the document. See Section 3.29.6. IndicatorExpression Zero or one. A composition of observables. See Section 3.29.4. IndicatorReference Zero or one. A reference to an indicator. See Section 3.29.7. NodeRole Zero or more. The role of the system in the attack should this indicator be matched to it. See Section 3.18.2. AttackPhase Zero or more. The phase in an attack life cycle during which this indicator might be seen. See Section 3.29.8. Reference Zero or more. A reference to additional information relevant to this indicator. See Section 3.11.1. AdditionalData Zero or more. EXTENSION. Mechanism by which to extend the data model. The Indicator class MUST have exactly one instance of an Observable, IndicatorExpression, ObservableReference, or IndicatorReference class. The StartTime and EndTime classes can be used to define an interval during which the indicator is valid. If both classes are present, the indicator is consider valid only during the described interval. If neither class is provided, the indicator is considered valid during any time interval. If only a StartTime is provided, the indicator is valid anytime after this timestamp. If only an EndTime is provided, the indicator is valid anytime prior to this timestamp.
The attributes of the Indicator class are: restriction Optional. ENUM. See Section 3.3.1. ext-restriction Optional. STRING. A means by which to extend the restriction attribute. See Section 5.1.1.3.29.1. IndicatorID Class
The IndicatorID class identifies an indicator with a globally unique identifier. The combination of the name and version attributes and the element content form this identifier. Indicators generated by given CSIRT MUST NOT reuse the same value unless they are referencing the same indicator. +------------------+ | IndicatorID | +------------------+ | ID | | | | STRING name | | STRING version | +------------------+ Figure 60: The IndicatorID Class The content of the class is of type ID and specifies an identifier for an indicator. The attributes of the IndicatorID class are: name Required. STRING. An identifier describing the CSIRT that created the indicator. In order to have a globally unique CSIRT name, the fully qualified domain name associated with the CSIRT MUST be used. This format is identical to the IncidentID@name attribute in Section 3.4. version Required. STRING. A version number of an indicator.
3.29.2. AlternativeIndicatorID Class
The AlternativeIndicatorID class lists alternative identifiers for an indicator. +-------------------------+ | AlternativeIndicatorID | +-------------------------+ | ENUM restriction |<>--{1..*}--[ IndicatorReference ] | STRING ext-restriction | +-------------------------+ Figure 61: The AlternativeIndicatorID Class The aggregate class of the AlternativeIndicatorID class is: IndicatorReference One or more. A reference to an indicator. See Section 3.29.7. The attributes of the AlternativeIndicatorID class are: restriction Optional. ENUM. See Section 3.3.1. ext-restriction Optional. STRING. A means by which to extend the restriction attribute. See Section 5.1.1.
3.29.3. Observable Class
The Observable class describes a feature and phenomenon that can be observed or measured for the purposes of detecting malicious behavior. +------------------------+ | Observable | +------------------------+ | ENUM restriction |<>--{0..1}--[ System ] | STRING ext-restriction |<>--{0..1}--[ Address ] | |<>--{0..1}--[ DomainData ] | |<>--{0..1}--[ Service ] | |<>--{0..1}--[ EmailData ] | |<>--{0..1}--[ WindowsRegistryKeysModified ] | |<>--{0..1}--[ FileData ] | |<>--{0..1}--[ CertificateData ] | |<>--{0..1]--[ RegistryHandle ] | |<>--{0..1}--[ RecordData ] | |<>--{0..1}--[ EventData ] | |<>--{0..1}--[ Incident ] | |<>--{0..1}--[ Expectation ] | |<>--{0..1}--[ Reference ] | |<>--{0..1}--[ Assessment ] | |<>--{0..1}--[ DetectionPattern ] | |<>--{0..1}--[ HistoryItem ] | |<>--{0..1}--[ BulkObservable ] | |<>--{0..*}--[ AdditionalData ] +------------------------+ Figure 62: The Observable Class The aggregate classes of the Observable class are: System Zero or one. A System observable. See Section 3.17. Address Zero or one. An Address observable. See Section 3.18.1. DomainData Zero or one. A DomainData observable. See Section 3.19. Service Zero or one. A Service observable. See Section 3.20. EmailData Zero or one. An EmailData observable. See Section 3.21.
WindowsRegistryKeysModified Zero or one. A WindowsRegistryKeysModified observable. See Section 3.23. FileData Zero or one. A FileData observable. See Section 3.25. CertificateData Zero or one. A CertificateData observable. See Section 3.24. RegistryHandle Zero or one. A RegistryHandle observable. See Section 3.9.1. RecordData Zero or one. A RecordData observable. See Section 3.22.1. EventData Zero or one. An EventData observable. See Section 3.14. Incident Zero or one. An Incident observable. See Section 3.2. Expectation Zero or one. An Expectation observable. See Section 3.15. Reference Zero or one. A Reference observable. See Section 3.11.1. Assessment Zero or one. An Assessment observable. See Section 3.12. DetectionPattern Zero or one. A DetectionPattern observable. See Section 3.10.1. HistoryItem Zero or one. A HistoryItem observable. See Section 3.13.1. BulkObservable Zero or one. A bulk list of observables. See Section 3.29.3.1. AdditionalData Zero or more. EXTENSION. Mechanism by which to extend the data model. The Observable class MUST have exactly one of the possible child classes.
The attributes of the Observable class are: restriction Optional. ENUM. See Section 3.3.1. ext-restriction Optional. STRING. A means by which to extend the restriction attribute. See Section 5.1.1.3.29.3.1. BulkObservable Class
The BulkObservable class allows the enumeration of a single type of observable without requiring each one to be encoded individually in multiple instances of the same class. The type attribute describes the type of observable listed in the child BulkObservableList class. The BulkObservableFormat class optionally provides additional metadata. +---------------------------+ | BulkObservable | +---------------------------+ | ENUM type |<>--{0..1}--[ BulkObservableFormat ] | STRING ext-type |<>----------[ BulkObservableList ] | |<>--{0..*}--[ AdditionalData ] +---------------------------+ Figure 63: The BulkObservable Class The aggregate classes of the BulkObservable class are: BulkObservableFormat Zero or one. Provides additional metadata about the observables enumerated in the BulkObservableList class. See Section 3.29.3.1.1. BulkObservableList One. STRING. A list of observables, one per line. Each line is separated with either a LF character or CR and LF characters. The type attribute specifies which observables will be listed. AdditionalData Zero or more. EXTENSION. Mechanism by which to extend the data model.
The attributes of the BulkObservable class are: type Optional. ENUM. The type of the observable listed in the child ObservableList class. These values are maintained in the "BulkObservable-type" IANA registry per Section 10.2. 1. asn. Autonomous System Number (per the Address@category attribute). 2. atm. Asynchronous Transfer Mode (ATM) address (per the Address@category attribute). 3. e-mail. Email address (per the Address@category attribute). 4. ipv4-addr. IPv4 host address in dotted-decimal notation, e.g., 192.0.2.1 (per the Address@category attribute). 5. ipv4-net. IPv4 network address in dotted-decimal notation, slash, significant bits, e.g., 192.0.2.0/24 (per the Address@category attribute). 6. ipv4-net-mask. IPv4 network address in dotted-decimal notation, slash, network mask in dotted-decimal notation, i.e., 192.0.2.0/255.255.255.0 (per the Address@category attribute). 7. ipv6-addr. IPv6 host address, e.g., 2001:DB8::3 (per the Address@category attribute). 8. ipv6-net. IPv6 network address, slash, significant bits, e.g., 2001:DB8::/32 (per the Address@category attribute). 9. ipv6-net-mask. IPv6 network address, slash, network mask (per the Address@category attribute). 10. mac. Media Access Control (MAC) address, i.e., a:b:c:d:e:f (per the Address@category attribute). 11. site-uri. A URL or URI for a resource (per the Address@category attribute). 12. domain-name. A fully qualified domain name or part of a name (e.g., fqdn.example.com, example.com). 13. domain-to-ipv4. A mapping of FQDN to IPv4 address specified as a comma-separated list (e.g., "fqdn.example.com, 192.0.2.1").
14. domain-to-ipv6. A mapping of FQDN to IPv6 address specified as a comma-separated list (e.g., "fqdn.example.com, 2001:DB8::3"). 15. domain-to-ipv4-timestamp. Same as domain-to-ipv4 but with a timestamp (in the DATETIME format) of the resolution (e.g., "fqdn.example.com, 192.0.2.1, 2015-06-11T00:38:31-06:00"). 16. domain-to-ipv6-timestamp. Same as domain-to-ipv6 but with a timestamp (in the DATETIME format) of the resolution (e.g., "fqdn.example.com, 2001:DB8::3, 2015-06-11T00:38:31-06:00"). 17. ipv4-port. An IPv4 address, port, and protocol tuple (e.g., 192.0.2.1, 80, TCP). The protocol name corresponds to the "Keyword" column in the "Assigned Internet Protocol Numbers" registry [IANA.Protocols]. 18. ipv6-port. An IPv6 address, port, and protocol tuple (e.g., 2001:DB8::3, 80, TCP). The protocol name corresponds to the "Keyword" column in the "Assigned Internet Protocol Numbers" registry [IANA.Protocols]. 19. windows-reg-key. A Microsoft Windows registry key. 20. file-hash. A file hash. The format of this hash is described in the Hash class that MUST be present in a sibling BulkObservableFormat class. 21. email-x-mailer. An X-Mailer field from an email. 22. email-subject. An email subject line. 23. http-user-agent. A User Agent field from an HTTP request header (e.g., "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0"). 24. http-request-uri. The Request URI from an HTTP request header. 25. mutex. The name of a system mutex (mutual exclusion lock). 26. file-path. A file path (e.g., "/tmp/local/file", "c:\windows\system32\file.sys"). 27. user-name. A username.
28. ext-value. A value used to indicate that this attribute is extended and the actual value is provided using the corresponding ext-* attribute. See Section 5.1.1. ext-type Optional. STRING. A means by which to extend the type attribute. See Section 5.1.1.3.29.3.1.1. BulkObservableFormat Class
The ObservableFormat class specifies metadata about the format of an observable enumerated in a sibling BulkObservableList class. +---------------------------+ | BulkObservableFormat | +---------------------------+ | |<>--{0..1}--[ Hash ] | |<>--{0..*}--[ AdditionalData ] +---------------------------+ Figure 64: The BulkObservableFormat Class The aggregate classes of the BulkObservableFormat class are: Hash Zero or one. Describes the format of a hash. See Section 3.26.1. AdditionalData Zero or more. EXTENSION. Mechanism by which to extend the data model. The BulkObservableFormat class has no attributes. Either Hash or AdditionalData MUST be present.3.29.4. IndicatorExpression Class
The IndicatorExpression describes an expression composed of observed phenomenon, features, or indicators. Elements of the expression can be described directly, reference relevant data from other parts of a given IODEF document, or reference previously defined indicators. All child classes of a given instance of IndicatorExpression form a boolean algebraic expression where the operator between them is determined by the operator attribute.
+--------------------------+ | IndicatorExpression | +--------------------------+ | ENUM operator |<>--{0..*}--[ IndicatorExpression ] | STRING ext-operator |<>--{0..*}--[ Observable ] | |<>--{0..*}--[ ObservableReference ] | |<>--{0..*}--[ IndicatorReference ] | |<>--{0..1}--[ Confidence ] | |<>--{0..*}--[ AdditionalData ] +--------------------------+ Figure 65: The IndicatorExpression Class The aggregate classes of the IndicatorExpression class are: IndicatorExpression Zero or more. An expression composed of other observables or indicators. See Section 3.29.4. Observable Zero or more. A description of an observable. See Section 3.29.3. ObservableReference Zero or more. A reference to an observable. See Section 3.29.6. IndicatorReference Zero or more. A reference to an indicator. See Section 3.29.7. Confidence Zero or one. An estimate of the confidence in the quality of the terms expressed in the expression. See Section 3.12.5. AdditionalData Zero or more. EXTENSION. Mechanism by which to extend the data model. The attributes of the IndicatorExpression class are: operator Optional. ENUM. The operator to be applied between the child elements. See Section 3.29.5 for parsing guidance. The default value is "and". These values are maintained in the "IndicatorExpression-operator" IANA registry per Section 10.2. 1. not. negation operator. 2. and. conjunction operator.
3. or. disjunction operator. 4. xor. exclusive disjunction operator. ext-operator Optional. STRING. A means by which to extend the operator attribute. See Section 5.1.1.3.29.5. Expressions with IndicatorExpression
Boolean algebraic expressions can be used to specify relationships between observables and indicators. These expressions are constructed through the use of the operator attribute and parent- child relationships in IndicatorExpressions. These expressions should be parsed as follows: 1. The operator specified by the operator attribute is applied between each of the child elements of the immediate parent IndicatorExpression element. If no operator attribute is specified, it should be assumed to be the conjunction operator (i.e., operator="and"). 2. A nested IndicatorExpression element with a parent IndicatorExpression is the equivalent of a parentheses in the expression. The following examples in Figures 66 through 70 illustrate these parsing rules: 1 : <IndicatorExpression> 2 [O1]: <Observable>..</Observable> 3 [O2]: <Observable>..</Observable> 4 : </IndicatorExpression> Equivalent expression: (O1 AND O2) Figure 66: Nested Elements in an IndicatorExpression without an Operator Attribute Specified 1 : <IndicatorExpression operator="or"> 2 [O1]: <Observable>..</Observable> 3 [O2]: <Observable>..</Observable> 4 : </IndicatorExpression> Equivalent expression: (O1 OR O2) Figure 67: Nested Elements in an IndicatorExpression with an Operator Attribute Specified
1 : <IndicatorExpression operator="or"> 2 : <IndicatorExpression operator="or"> 3 [O1]: <Observable>..</Observable> 4 [O2]: <Observable>..</Observable> 5 : </IndicatorExpression> 6 [O3]: <Observable>..</Observable> 7 : </IndicatorExpression> Equivalent expression: ((O1 OR O2) OR O3) Figure 68: Nested Elements with a Recursive IndicatorExpression with an Operator Attribute Specified 1 : <IndicatorExpression operator="not"> 2 : <IndicatorExpression operator="and"> 3 [O1]: <Observable>..</Observable> 4 [O2]: <Observable>..</Observable> 5 : </IndicatorExpression> 6 : </IndicatorExpression> Equivalent expression: (NOT (O1 AND O2)) Figure 69: A Recursive IndicatorExpression with an Operator Attribute Specified 1 : <IndicatorExpression operator="or"> 2 : <IndicatorExpression> 3 [O1 with low confidence] : <Observable>..</Observable> 4 : <Confidence rating="low" /> 5 : </IndicatorExpression> 6 : <IndicatorExpression> 7 [O2 with high confidence]: <Observable>..</Observable> 8 : <Confidence rating="high" /> 9 : </IndicatorExpression> 10 : </IndicatorExpression> Equivalent expression: ((O1) OR (O2)) Figure 70: Varying Confidence on Particular Observables Invalid algebraic expressions while valid XML MUST NOT be specified.
3.29.6. ObservableReference Class
The ObservableReference describes a reference to an observable feature or phenomenon described elsewhere in the document. The ObservableReference class has no content. +-------------------------+ | ObservableReference | +-------------------------+ | IDREF uid-ref | +-------------------------+ Figure 71: The ObservableReference Class The ObservableReference class has no content. The attribute of the ObservableReference class is: uid-ref Required. IDREF. An identifier that serves as a reference to a class in the IODEF document. The referenced class will have this identifier set in its observable-id attribute.3.29.7. IndicatorReference Class
The IndicatorReference describes a reference to an indicator. This reference may be to an indicator described in this IODEF document or in a previously exchanged IODEF document. The IndicatorReference class has no content. +--------------------------+ | IndicatorReference | +--------------------------+ | IDREF uid-ref | | STRING euid-ref | | STRING version | +--------------------------+ Figure 72: The IndicatorReference Class The attributes of the IndicatorReference class are: uid-ref Optional. IDREF. An identifier that references an Indicator class in the IODEF document. The referenced Indicator class will have this identifier set in its IndicatorID class.
euid-ref Optional. STRING. An identifier that references an IndicatorID not in this IODEF document. version Optional. STRING. A version number of an indicator. Either the uid-ref or the euid-ref attribute MUST be set.3.29.8. AttackPhase Class
The AttackPhase class describes a particular phase of an attack life cycle. +------------------------+ | AttackPhase | +------------------------+ | |<>--{0..*}--[ AttackPhaseID ] | |<>--{0..*}--[ URL ] | |<>--{0..*}--[ Description ] | |<>--{0..*}--[ AdditionalData ] +------------------------+ Figure 73: The AttackPhase Class The aggregate classes of the AttackPhase class are: AttackPhaseID Zero or more. STRING. An identifier for the phase of the attack. URL Zero or more. URL. A URL to a resource describing this phase of the attack. Description Zero or more. ML_STRING. A free-form text description of this phase of the attack. AdditionalData Zero or more. EXTENSION. A mechanism by which to extend the data model. AttackPhase MUST have at least one instance of a child class. The AttackPhase class has no attributes.
4. Processing Considerations
This section provides additional requirements and guidance on creating and processing IODEF documents.4.1. Encoding
Every IODEF document MUST begin with an XML declaration and MUST specify the XML version used. The character encoding MUST also be explicitly specified. UTF-8 [RFC3629] SHOULD be used unless UTF-16 [RFC2781] is necessary. Encodings other than UTF-8 and UTF-16 SHOULD NOT be used. The IODEF conforms to all XML data-encoding conventions and constraints. The XML declaration with UTF-8 character encoding will read as follows: <?xml version="1.0" encoding="UTF-8" ?> Certain characters have special meaning in XML and MUST not appear in literal form. Per Section 2.4 of [W3C.XML], these characters MUST be escaped with a numeric character or entity reference.4.2. IODEF Namespace
The IODEF schema declares a namespace of "urn:ietf:params:xml:ns:iodef-2.0" and registers it per [W3C.XMLNS]. Each IODEF document MUST include a valid reference to the IODEF schema using the "xsi:schemaLocation" attribute. An example of such a declaration would look as follows: <IODEF-Document version="2.00" lang="en-US" xmlns:iodef="urn:ietf:params:xml:ns:iodef-2.0" xsi:schemaLocation="urn:ietf:params:xmls:schema:iodef-2.0" ...>4.3. Validation
IODEF documents MUST be well-formed XML. It is RECOMMENDED that recipients validate the document against the schema described in Section 8. However, mere conformance to this schema is not sufficient for a semantically valid IODEF document. The text of Section 3 describes further formatting and constraints, including some that cannot be conveniently encoded in the schema. These MUST also be considered by an IODEF implementation. Furthermore, the enumerated values present in this document are a static list that will be incomplete over time as select attributes can be extended by a corresponding IANA registry per Section 10.2. Therefore, IODEF
implementations SHOULD periodically update their schema and MAY need to update their parsing algorithms to incorporate newly registered values.4.4. Incompatibilities with v1
The IODEF data model in this document makes a number of changes to [RFC5070]. These changes were largely additive -- classes and enumerated values were added. However, some incompatibilities between [RFC5070] and this new specification were introduced. These incompatibilities are as follows: o The IODEF-Document@version attribute is set to "2.0". o Attributes with enumerated values can now also be extended with IANA registries. o All iodef:MLStringType classes use xml:lang. IODEF-Document also uses xml:lang. o The Service@ip_protocol attribute was renamed to @ip-protocol. o The Node/NodeName class was removed in favor of representing domain names with Node/DomainData/Name class. The Node/DataTime class was also removed, so that the Node/DomainData/ DateDomainWasChecked class can represent the time at which the name-to-address resolution occurred. o The Node/NodeRole class was moved to System/NodeRole. o The Reference class is now defined by [RFC7495]. o The data previously represented in the Impact class is now in the SystemImpact and IncidentCategory classes. The Impact class has been removed. o The semantics of Counter@type are now represented in Counter@unit. o The IODEF-Document@formatid attribute has been renamed to @format- id. o The Incident/ReportTime class is no longer required. However, the GenerationTime class is required. o The Fax class was removed and is now represented by a generic Telephone class.
o The Telephone, Email, and PostalAddress classes were redefined from improved internationalization. o The "ipv6-net-mask" value was removed from the category attribute of Address.5. Extending the IODEF
In order to support the dynamic nature of security operations, the IODEF data model will need to continue to evolve. This section discusses how new data elements can be incorporated into the IODEF. There is support to add additional enumerated values and new classes. Adding additional attributes to existing classes is not supported. These extension mechanisms are designed so that adding new data elements is possible without requiring modifications to this document. Extensions can be implemented publicly or privately. With proven value, well-documented extensions can be incorporated into future versions of the specification.5.1. Extending the Enumerated Values of Attributes
Additional enumerated values can be added to select attributes either through the use of specially marked attributes with the "ext-" prefix or through a set of corresponding IANA registries. The former approach allows for the extension to remain private. The latter approach is public.5.1.1. Private Extension of Enumerated Values
The data model supports adding new enumerated values to an attribute without public registration. For each attribute that supports this extension technique, there is a corresponding attribute in the same element whose name is identical but with a prefix of "ext-". This special attribute is referred to as the extension attribute. The attribute being extended is referred to as an extensible attribute. For example, an extensible attribute named "foo" will have a corresponding extension attribute named "ext-foo". An element may have many extensible attributes. In addition to a corresponding extension attribute, each extensible attribute has "ext-value" as one its possible enumerated values. Selection of this particular value in an extensible attribute signals that the extension attribute contains data. Otherwise, this "ext-value" value has no meaning.
In order to add a new enumerated value to an extensible attribute, the value of this attribute MUST be set to "ext-value", and the new desired value MUST be set in the corresponding extension attribute. For example, extending the type attribute of the SystemImpact class would look as follows: <SystemImpact type="ext-value" ext-type="new-attack-type"> A given extension attribute MUST NOT be set unless the corresponding extensible attribute has been set to "ext-value".5.1.2. Public Extension of Enumerated Values
The data model also supports publicly extending select enumerated attributes. A new entry can be added by registering a new entry in the appropriate IANA registry. Section 10.2 provides a mapping between the extensible attributes and their corresponding registry. Section 4.3 discusses the XML validation implications of this type of extension. All extensible attributes that support private extensions also support public extensions.5.2. Extending Classes
Classes of the EXTENSION (iodef:ExtensionType) type can extend the data model. They provide the ability to have new atomic or XML- encoded data elements in all of the top-level classes of the Incident class and in a few of the complex subordinate classes. As there are multiple instances of the extensible classes in the data model, there is discretion on where to add a new data element. It is RECOMMENDED that the extension be placed in the most closely related class to the new information. Extensions using the atomic data types (i.e., all values of the dtype attributes other than "xml") MUST: 1. Set the element content to the desired value, and 2. Set the dtype attribute to correspond to the data type of the element content.
The following guidelines exist for extensions using XML (i.e., dtype="xml"): 1. The element content of the extensible class MUST be set to the desired value, and the dtype attribute MUST be set to "xml". 2. The extension schema MUST declare a separate namespace. It is RECOMMENDED that these extensions have the prefix "iodef-". This recommendation makes readability of the document easier by allowing the reader to infer which namespaces relate to IODEF by inspection. 3. It is RECOMMENDED that extension schemas follow the naming convention of the IODEF data model. This too improves the readability of extended IODEF documents. The names of all elements SHOULD be capitalized. For elements with composed names, a capital letter SHOULD be used for each word. Attribute names SHOULD be in lowercase. Attributes with composed names SHOULD be separated by a hyphen. 4. Implementations that encounter an unrecognized element, attribute, or attribute value in a supported namespace SHOULD reject the document as a syntax error. 5. There are security and performance implications in requiring implementations to dynamically download schemas at runtime. Therefore, implementations MUST NOT download schemas at runtime unless the appropriate precautions are taken. Implementations also need to contend with the potential of significant network and processing issues. 6. Some adopters of the IODEF may have private schema definitions that are not publicly available. Thus, implementations may encounter IODEF documents with references to private schemas that may not be resolvable. Hence, IODEF document recipients MUST be prepared for a schema definition in an IODEF document never to resolve.
The following schema and XML document excerpt provide a template for an extension schema and its use in the IODEF document. This example schema defines a namespace of "iodef-extension1" and a single element named "newdata". <xs:schema targetNamespace="iodef-extension1.xsd" xmlns:iodef-extension1="iodef-extension1.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema"> attributeFormDefault="unqualified" elementFormDefault="qualified"> <xs:import namespace="urn:ietf:params:xml:ns:iodef-2.0" schemaLocation=" urn:ietf:params:xml:schema:iodef-2.0"/> <xs:element name="newdata" type="xs:string" /> </xs:schema> The following XML excerpt demonstrates the use of the above schema as an extension to the IODEF. <IODEF-Document version="2.00" lang="en-US" xmlns="urn:ietf:params:xml:ns:iodef-2.0" xmlns:iodef=" urn:ietf:params:xml:ns:iodef-2.0" xmlns:iodef-extension1="iodef-extension1.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="iodef-extension1.xsd"> <Incident purpose="reporting"> ... <AdditionalData dtype="xml" meaning="xml"> <iodef-extension1:newdata> Field that could not be represented elsewhere </iodef-extension1:newdata> </AdditionalData> </Incident> </IODEF-Document>5.3. Deconflicting Private Extensions
To disambiguate which private extension is used in an IODEF document, the data model provides a means to identify the source of an extension. Two attributes in the IODEF-Document class, private-enum-name and private-enum-id, are used to specify this attribution. Only a single private extension can be identified in a given IODEF-Document.
If an implementor has a single private extension, then only the private-enum-name attribute needs to be specified. Multiple distinct private extensions or versioning of a single extension can be attributed by also setting the corresponding private-num-id attribute. The following XML excerpt demonstrates the specification of a private extension from "example.com" with an identifier of "13". <IODEF-Document version="2.00" lang="en-US" private-enum-name="example.com" private-enum-id="13" ...> ... </IODEF-Document> If an unrecognized private extension is encountered in processing, the recipient MAY reject the entire document as a syntax error.6. Internationalization Issues
Internationalization and localization is of specific concern to the IODEF as it facilitates operational coordination with a diverse set of partners. The IODEF implements internationalization by relying on XML constructs and through explicit design choices in the data model. Since the IODEF is implemented as an XML schema, it supports different character encodings, such as UTF-8 and UTF-16, that are possible with XML. Additionally, each IODEF document MUST specify the language in which its content is encoded. The language can be specified with the attribute "xml:lang" (per Section 2.12 of [W3C.XML]) in the top-level element (i.e., IODEF-Document) and lets all other elements inherit that definition. All IODEF classes with a free-form text definition (i.e., all those defined with type iodef:MLStringType) can also specify a language different from the rest of the document. The data model supports multiple translations of free-form text. All ML_STRING (iodef:MLStringType) classes have a one-to-many cardinality to their parent. This allows the identical text translated into different languages to be encoded in different instances of the same class with a common parent. This design also enables the creation of a single document containing all the translations. The IODEF implementation SHOULD extract the appropriate language relevant to the recipient.
Related instances of a given iodef:MLStringType class that are translations of each other are identified by a common identifier set in the translation-id attribute. The example below shows three instances of a Description class expressed in three different languages. The relationship between these three instances of the Description class is conveyed by the common value of "1" in the translation-id attribute. <IODEF-Document version="2.00" xml:lang="en" ...> <Incident purpose="reporting"> ... <Description translation-id="1" xml:lang="en">English</Description> <Description translation-id="1" xml:lang="de">Englisch</Description> <Description translation-id="1" xml:lang="fr">Anglais</Description> The IODEF balances internationalization support with the need for interoperability. While the IODEF supports different languages, the data model also relies heavily on standardized enumerated attributes that can crudely approximate the contents of the document. With this approach, a CSIRT should be able to make some sense of an IODEF document it receives even if the free-form text data elements are written in a language unfamiliar to the recipient.7. Examples
This section provides examples of IODEF documents. These examples do not represent the full capabilities of the data model or the only way to encode particular information.7.1. Minimal Example
A document containing only the mandatory elements and attributes. <?xml version="1.0" encoding="UTF-8"?> <!-- Minimum IODEF document --> <IODEF-Document version="2.00" xml:lang="en" xmlns="urn:ietf:params:xml:ns:iodef-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://www.iana.org/assignments/xml-registry/schema/ iodef-2.0.xsd"> <Incident purpose="reporting" restriction="private"> <IncidentID name="csirt.example.com">492382</IncidentID> <GenerationTime>2015-07-18T09:00:00-05:00</GenerationTime> <Contact type="organization" role="creator">
<Email> <EmailTo>contact@csirt.example.com</EmailTo> </Email> </Contact> <!-- Add more fields to make the document useful --> </Incident> </IODEF-Document>7.2. Indicators from a Campaign
An example of C2 domains from a given campaign. <?xml version="1.0" encoding="UTF-8"?> <!-- A list of C2 domains associated with a campaign --> <IODEF-Document version="2.00" xml:lang="en" xmlns="urn:ietf:params:xml:ns:iodef-2.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation= "http://www.iana.org/assignments/xml-registry/schema/ iodef-2.0.xsd"> <Incident purpose="watch" restriction="green"> <IncidentID name="csirt.example.com">897923</IncidentID> <RelatedActivity> <ThreatActor> <ThreatActorID> TA-12-AGGRESSIVE-BUTTERFLY </ThreatActorID> <Description>Aggressive Butterfly</Description> </ThreatActor> <Campaign> <CampaignID>C-2015-59405</CampaignID> <Description>Orange Giraffe</Description> </Campaign> </RelatedActivity> <GenerationTime>2015-10-02T11:18:00-05:00</GenerationTime> <Description>Summarizes the Indicators of Compromise for the Orange Giraffe campaign of the Aggressive Butterfly crime gang. </Description> <Assessment> <BusinessImpact type="breach-proprietary"/> </Assessment> <Contact type="organization" role="creator"> <ContactName>CSIRT for example.com</ContactName> <Email> <EmailTo>contact@csirt.example.com</EmailTo> </Email> </Contact>
<IndicatorData> <Indicator> <IndicatorID name="csirt.example.com" version="1"> G90823490 </IndicatorID> <Description>C2 domains</Description> <StartTime>2014-12-02T11:18:00-05:00</StartTime> <Observable> <BulkObservable type="fqdn"> <BulkObservableList> kj290023j09r34.example.com 09ijk23jfj0k8.example.net klknjwfjiowjefr923.example.org oimireik79msd.example.org </BulkObservableList> </BulkObservable> </Observable> </Indicator> </IndicatorData> </Incident> </IODEF-Document>