Repository: metron Updated Branches: refs/heads/master b3148a182 -> 3d95fdf90
METRON-1102: Add support for ingesting cybox URI observables from taxii feeds closes apache/incubator-metron#689 Project: http://git-wip-us.apache.org/repos/asf/metron/repo Commit: http://git-wip-us.apache.org/repos/asf/metron/commit/3d95fdf9 Tree: http://git-wip-us.apache.org/repos/asf/metron/tree/3d95fdf9 Diff: http://git-wip-us.apache.org/repos/asf/metron/diff/3d95fdf9 Branch: refs/heads/master Commit: 3d95fdf906993c8d65b76a7e1311c7fb295e19b1 Parents: b3148a1 Author: cstella <ceste...@gmail.com> Authored: Fri Aug 11 13:29:07 2017 -0400 Committer: cstella <ceste...@gmail.com> Committed: Fri Aug 11 13:29:07 2017 -0400 ---------------------------------------------------------------------- .../metron-data-management/README.md | 6 ++ .../dataloads/extractor/stix/StixExtractor.java | 15 +++ .../stix/types/ObjectTypeHandlers.java | 1 + .../extractor/stix/types/URIHandler.java | 68 ++++++++++++++ .../extractor/stix/URIHandlerTest.java | 97 ++++++++++++++++++++ 5 files changed, 187 insertions(+) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/metron/blob/3d95fdf9/metron-platform/metron-data-management/README.md ---------------------------------------------------------------------- diff --git a/metron-platform/metron-data-management/README.md b/metron-platform/metron-data-management/README.md index 014f3ef..c351f48 100644 --- a/metron-platform/metron-data-management/README.md +++ b/metron-platform/metron-data-management/README.md @@ -97,6 +97,11 @@ Consider the following config for importing STIX documents. This is a threat in format, so it is particularly relevant and attractive data to import for our purposes. Because STIX is a standard format, there is no need to specify the schema or how to interpret the documents. +We support the versions of Stix and Cybox supported by +[java-stix](https://github.com/STIXProject/java-stix/tree/v1.2.0.2): +* Stix - [1.2](https://github.com/STIXProject/schemas/blob/356cc4f6b06625465f0808388eb166807313b4e0/stix_core.xsd) and earlier +* Cybox - [2.1](https://github.com/CybOXProject/schemas/blob/97beb32c376a9223e91b52cb3e4c8d2af6baf786/cybox_core.xsd) and earlier + We support a subset of STIX messages for importation: | STIX Type | Specific Type | Enrichment Type Name | @@ -107,6 +112,7 @@ We support a subset of STIX messages for importation: | Address | MAC | address:MAC | | Domain | FQDN | domain:FQDN | | Hostname | | hostname | +| URI | | uriobjecttype | NOTE: The enrichment type will be used as the type above. http://git-wip-us.apache.org/repos/asf/metron/blob/3d95fdf9/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/StixExtractor.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/StixExtractor.java b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/StixExtractor.java index 41b428e..f96bd2d 100644 --- a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/StixExtractor.java +++ b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/StixExtractor.java @@ -30,14 +30,18 @@ import org.mitre.cybox.cybox_2.Observables; import org.mitre.stix.common_1.IndicatorBaseType; import org.mitre.stix.indicator_2.Indicator; import org.mitre.stix.stix_1.STIXPackage; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; +import java.lang.invoke.MethodHandles; import java.util.ArrayList; import java.util.List; import java.util.Map; public class StixExtractor implements Extractor { + private static final Logger LOG = LoggerFactory.getLogger(MethodHandles.lookup().lookupClass()); Map<String, Object> config; @Override public Iterable<LookupKV> extract(String line) throws IOException { @@ -50,11 +54,22 @@ public class StixExtractor implements Extractor { if(props != null) { ObjectTypeHandler handler = ObjectTypeHandlers.getHandlerByInstance(props); if (handler != null) { + if(LOG.isDebugEnabled()) { + LOG.debug("Found {} for properties {}" + , handler.getTypeClass().getCanonicalName() + , props.toXMLString()); + } Iterable<LookupKV> extractions = handler.extract(props, config); for(LookupKV extraction : extractions) { ret.add(extraction); } } + else if(LOG.isDebugEnabled()) { + LOG.debug("Did not find a handler for properties {} of type {}" + , props.toXMLString() + , props.getClass() + ); + } } } } http://git-wip-us.apache.org/repos/asf/metron/blob/3d95fdf9/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/ObjectTypeHandlers.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/ObjectTypeHandlers.java b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/ObjectTypeHandlers.java index 06d8cd8..df2c915 100644 --- a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/ObjectTypeHandlers.java +++ b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/ObjectTypeHandlers.java @@ -23,6 +23,7 @@ public enum ObjectTypeHandlers { ADDRESS(new AddressHandler()) ,HOSTNAME(new HostnameHandler()) ,DOMAINNAME(new DomainHandler()) + ,URI(new URIHandler()) ,; ObjectTypeHandler _handler; ObjectTypeHandlers(ObjectTypeHandler handler) { http://git-wip-us.apache.org/repos/asf/metron/blob/3d95fdf9/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/URIHandler.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/URIHandler.java b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/URIHandler.java new file mode 100644 index 0000000..2adfb8a --- /dev/null +++ b/metron-platform/metron-data-management/src/main/java/org/apache/metron/dataloads/extractor/stix/types/URIHandler.java @@ -0,0 +1,68 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.metron.dataloads.extractor.stix.types; + +import com.google.common.collect.ImmutableList; +import org.apache.metron.enrichment.converter.EnrichmentKey; +import org.apache.metron.enrichment.converter.EnrichmentValue; +import org.apache.metron.enrichment.lookup.LookupKV; +import org.mitre.cybox.common_2.AnyURIObjectPropertyType; +import org.mitre.cybox.objects.URIObjectType; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class URIHandler extends AbstractObjectTypeHandler<URIObjectType> { + public URIHandler() { + super(URIObjectType.class); + } + + @Override + public Iterable<LookupKV> extract(URIObjectType type, Map<String, Object> config) throws IOException { + List<LookupKV> ret = new ArrayList<>(); + if(type != null) { + AnyURIObjectPropertyType val = type.getValue(); + if(val != null) { + Object v = val.getValue(); + if(v != null) { + final String indicatorType = getType(); + LookupKV results = new LookupKV(new EnrichmentKey(indicatorType, v.toString()) + , new EnrichmentValue( + new HashMap<String, Object>() {{ + put("source-type", "STIX"); + put("uri", v.toString()); + put("indicator-type", indicatorType); + put("source", type.toXMLString()); + }} + ) + ); + ret.add(results); + } + } + } + return ret; + } + + @Override + public List<String> getPossibleTypes() { + return ImmutableList.of(getType()); + } +} http://git-wip-us.apache.org/repos/asf/metron/blob/3d95fdf9/metron-platform/metron-data-management/src/test/java/org/apache/metron/dataloads/extractor/stix/URIHandlerTest.java ---------------------------------------------------------------------- diff --git a/metron-platform/metron-data-management/src/test/java/org/apache/metron/dataloads/extractor/stix/URIHandlerTest.java b/metron-platform/metron-data-management/src/test/java/org/apache/metron/dataloads/extractor/stix/URIHandlerTest.java new file mode 100644 index 0000000..ff41152 --- /dev/null +++ b/metron-platform/metron-data-management/src/test/java/org/apache/metron/dataloads/extractor/stix/URIHandlerTest.java @@ -0,0 +1,97 @@ +/** + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.metron.dataloads.extractor.stix; + +import com.google.common.collect.Iterables; +import org.adrianwalker.multilinestring.Multiline; +import org.apache.metron.dataloads.extractor.stix.types.URIHandler; +import org.apache.metron.enrichment.converter.EnrichmentKey; +import org.apache.metron.enrichment.lookup.LookupKV; +import org.junit.Assert; +import org.junit.Test; +import org.mitre.cybox.objects.URIObjectType; + +import java.util.HashMap; +import java.util.List; + +public class URIHandlerTest { + + /** + *<?xml version="1.0" encoding="UTF-8"?> + *<stix:STIX_Package xmlns:stix="http://stix.mitre.org/stix-1" + * xmlns:tdq="http://taxii.mitre.org/query/taxii_default_query-1" + * xmlns:TOUMarking="http://data-marking.mitre.org/extensions/MarkingStructure#Terms_Of_Use-1" + * xmlns:stixVocabs="http://stix.mitre.org/default_vocabularies-1" + * xmlns:cyboxCommon="http://cybox.mitre.org/common-2" + * xmlns:simpleMarking="http://data-marking.mitre.org/extensions/MarkingStructure#Simple-1" + * xmlns:cyboxVocabs="http://cybox.mitre.org/default_vocabularies-2" + * xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" + * xmlns:stixCommon="http://stix.mitre.org/common-1" + * xmlns:edge="http://soltra.com/" + * xmlns:marking="http://data-marking.mitre.org/Marking-1" + * xmlns:tlpMarking="http://data-marking.mitre.org/extensions/MarkingStructure#TLP-1" + * xmlns:taxii_11="http://taxii.mitre.org/messages/taxii_xml_binding-1.1" + * xmlns:opensource="http://hailataxii.com" + * xmlns:URIObj="http://cybox.mitre.org/objects#URIObject-2" + * xmlns:taxii="http://taxii.mitre.org/messages/taxii_xml_binding-1" + * xmlns:cybox="http://cybox.mitre.org/cybox-2" + * id="edge:Package-208ba7e1-ecc1-49a1-a96d-f28c4146761d" + * timestamp="2017-08-09T21:05:27.148461+00:00" + * version="1.1.1"> + * <stix:STIX_Header> + * <stix:Handling> + * <marking:Marking> + * <marking:Controlled_Structure>../../../../descendant-or-self::node()</marking:Controlled_Structure> + * <marking:Marking_Structure color="WHITE" xsi:type="tlpMarking:TLPMarkingStructureType"/> + * <marking:Marking_Structure xsi:type="TOUMarking:TermsOfUseMarkingStructureType"> + * <TOUMarking:Terms_Of_Use>TBD</TOUMarking:Terms_Of_Use> + * </marking:Marking_Structure> + * <marking:Marking_Structure xsi:type="simpleMarking:SimpleMarkingStructureType"> + * <simpleMarking:Statement>Unclassified (Public)</simpleMarking:Statement> + * </marking:Marking_Structure> + * </marking:Marking> + * </stix:Handling> + * </stix:STIX_Header> + * <stix:Observables cybox_major_version="2" cybox_minor_version="1" cybox_update_version="0"> + * <cybox:Observable id="opensource:Observable-6b98960f-c8bb-45fd-8b6d-8960e803b51f" sighting_count="1"> + * <cybox:Title>URL: http://www.kotimi.com/alpha/gtex/...</cybox:Title> + * <cybox:Description>URL: http://www.kotimi.com/alpha/gtex/| isOnline:yes| dateVerified:2017-07-31T22:03:10+00:00</cybox:Description> + * <cybox:Object id="opensource:URI-9baf3b48-4aa2-4198-92b7-b5cb0a0a1d35"> + * <cybox:Properties type="URL" xsi:type="URIObj:URIObjectType"> + * <URIObj:Value condition="Equals">http://www.kotimi.com/alpha/gtex/</URIObj:Value> + * </cybox:Properties> + * </cybox:Object> + * </cybox:Observable> + * </stix:Observables> + *</stix:STIX_Package> + */ + @Multiline + static String uriHandlerObject; + + @Test + public void testURIHandler() throws Exception { + StixExtractor extractor = new StixExtractor(); + extractor.initialize(new HashMap<>()); + Iterable<LookupKV> kvs = extractor.extract(uriHandlerObject); + Assert.assertEquals(1, Iterables.size(kvs)); + LookupKV kv = Iterables.getFirst(kvs, null); + EnrichmentKey key = (EnrichmentKey) kv.getKey(); + Assert.assertEquals("http://www.kotimi.com/alpha/gtex/", key.getIndicator()); + Assert.assertEquals("uriobjecttype", key.type); + } +}