19 package org.sleuthkit.autopsy.centralrepository.datamodel;
21 import java.util.ArrayList;
22 import java.util.Arrays;
23 import java.util.HashSet;
24 import java.util.List;
26 import java.util.logging.Level;
27 import org.openide.util.NbBundle.Messages;
35 import org.
sleuthkit.datamodel.BlackboardArtifact.ARTIFACT_TYPE;
37 import org.
sleuthkit.datamodel.BlackboardAttribute.ATTRIBUTE_TYPE;
39 import org.
sleuthkit.datamodel.InvalidAccountIDException;
50 private static final List<String>
domainsToSkip = Arrays.asList(
"localhost",
"127.0.0.1");
54 ARTIFACT_TYPE.TSK_WEB_BOOKMARK.getTypeID(),
55 ARTIFACT_TYPE.TSK_WEB_COOKIE.getTypeID(),
56 ARTIFACT_TYPE.TSK_WEB_DOWNLOAD.getTypeID(),
57 ARTIFACT_TYPE.TSK_WEB_HISTORY.getTypeID(),
58 ARTIFACT_TYPE.TSK_WEB_CACHE.getTypeID()
71 @Messages({
"CorrelationAttributeUtil.emailaddresses.text=Email Addresses"})
73 return Bundle.CorrelationAttributeUtil_emailaddresses_text();
84 addAll(DOMAIN_ARTIFACT_TYPE_IDS);
86 add(ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID());
87 add(ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID());
88 add(ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID());
89 add(ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID());
90 add(ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID());
91 add(ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID());
92 add(ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID());
93 add(ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID());
94 add(ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID());
112 if (SOURCE_TYPES_FOR_CR_INSERT.contains(artifact.getArtifactTypeID())) {
119 return new ArrayList<>();
147 List<CorrelationAttributeInstance> correlationAttrs =
new ArrayList<>();
150 if (sourceArtifact != null) {
151 int artifactTypeID = sourceArtifact.getArtifactTypeID();
152 if (artifactTypeID == ARTIFACT_TYPE.TSK_KEYWORD_HIT.getTypeID()) {
153 BlackboardAttribute setNameAttr = sourceArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_SET_NAME));
157 }
else if (DOMAIN_ARTIFACT_TYPE_IDS.contains(artifactTypeID)) {
158 BlackboardAttribute domainAttr = sourceArtifact.getAttribute(
new BlackboardAttribute.Type(ATTRIBUTE_TYPE.TSK_DOMAIN));
159 if ((domainAttr != null)
160 && !domainsToSkip.contains(domainAttr.getValueString())) {
163 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_ATTACHED.getTypeID()) {
167 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK.getTypeID()) {
170 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WIFI_NETWORK_ADAPTER.getTypeID()
171 || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_PAIRING.getTypeID()
172 || artifactTypeID == ARTIFACT_TYPE.TSK_BLUETOOTH_ADAPTER.getTypeID()) {
175 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_DEVICE_INFO.getTypeID()) {
180 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_SIM_ATTACHED.getTypeID()) {
184 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_WEB_FORM_ADDRESS.getTypeID()) {
188 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_ACCOUNT.getTypeID()) {
191 }
else if (artifactTypeID == ARTIFACT_TYPE.TSK_CONTACT.getTypeID()
192 || artifactTypeID == ARTIFACT_TYPE.TSK_CALLLOG.getTypeID()
193 || artifactTypeID == ARTIFACT_TYPE.TSK_MESSAGE.getTypeID()) {
198 logger.log(Level.WARNING, String.format(
"Error normalizing correlation attribute (%s)", artifact), ex);
199 return correlationAttrs;
200 }
catch (InvalidAccountIDException ex) {
201 logger.log(Level.WARNING, String.format(
"Invalid account identifier (artifactID: %d)", artifact.getId()));
202 return correlationAttrs;
204 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", artifact), ex);
205 return correlationAttrs;
206 }
catch (TskCoreException ex) {
207 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", artifact), ex);
208 return correlationAttrs;
210 logger.log(Level.SEVERE,
"Error getting current case", ex);
211 return correlationAttrs;
213 return correlationAttrs;
236 if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER))) {
237 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER)).getValueString();
238 }
else if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM))) {
239 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_FROM)).getValueString();
240 }
else if (null != artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO))) {
241 value = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_PHONE_NUMBER_TO)).getValueString();
252 if (corrAttr != null) {
253 corrAttrInstances.add(corrAttr);
272 BlackboardArtifact sourceArtifact = null;
273 if (BlackboardArtifact.ARTIFACT_TYPE.TSK_INTERESTING_ARTIFACT_HIT.getTypeID() == artifact.getArtifactTypeID()) {
274 BlackboardAttribute assocArtifactAttr = artifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ASSOCIATED_ARTIFACT));
275 if (assocArtifactAttr != null) {
279 sourceArtifact = artifact;
281 return sourceArtifact;
297 private static void makeCorrAttrFromAcctArtifact(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact acctArtifact)
throws InvalidAccountIDException, TskCoreException, CentralRepoException {
300 BlackboardAttribute accountTypeAttribute = acctArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ACCOUNT_TYPE));
301 String accountTypeStr = accountTypeAttribute.getValueString();
305 Account.Type predefinedAccountType = Account.Type.PREDEFINED_ACCOUNT_TYPES.stream().filter(type -> type.getTypeName().equalsIgnoreCase(accountTypeStr)).findAny().orElse(null);
308 if (Account.Type.DEVICE.getTypeName().equalsIgnoreCase(accountTypeStr) ==
false && predefinedAccountType != null) {
317 BlackboardAttribute accountIdAttribute = acctArtifact.getAttribute(
new BlackboardAttribute.Type(BlackboardAttribute.ATTRIBUTE_TYPE.TSK_ID));
318 String accountIdStr = accountIdAttribute.getValueString();
324 if (corrAttr != null) {
326 corrAttr.setAccountId(crAccount.
getId());
327 corrAttrInstances.add(corrAttr);
346 private static void makeCorrAttrFromArtifactAttr(List<CorrelationAttributeInstance> corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType,
int typeId)
throws CentralRepoException, TskCoreException {
347 BlackboardAttribute attribute = artifact.getAttribute(
new BlackboardAttribute.Type(artAttrType));
348 if (attribute != null) {
349 String value = attribute.getValueString();
350 if ((null != value) && (value.isEmpty() ==
false)) {
353 corrAttrInstances.add(inst);
379 AbstractFile bbSourceFile = currentCase.
getSleuthkitCase().getAbstractFileById(artifact.getObjectID());
380 if (null == bbSourceFile) {
381 logger.log(Level.SEVERE,
"Error creating artifact instance. Abstract File was null.");
391 bbSourceFile.getParentPath() + bbSourceFile.
getName(),
393 TskData.FileKnown.UNKNOWN,
394 bbSourceFile.getId());
396 }
catch (TskCoreException ex) {
397 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", artifact), ex);
399 }
catch (CentralRepoException ex) {
400 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", artifact), ex);
403 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", artifact), ex);
405 }
catch (NoCurrentCaseException ex) {
406 logger.log(Level.SEVERE,
"Error getting current case", ex);
440 if (null == correlationCase) {
445 }
catch (TskCoreException ex) {
446 logger.log(Level.SEVERE, String.format(
"Error getting querying case database (%s)", file), ex);
448 }
catch (CentralRepoException ex) {
449 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
451 }
catch (NoCurrentCaseException ex) {
452 logger.log(Level.SEVERE,
"Error getting current case", ex);
459 }
catch (CentralRepoException ex) {
460 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
463 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
473 if (correlationAttributeInstance == null && file.getMd5Hash() != null) {
474 String filePath = (file.getParentPath() + file.getName()).toLowerCase();
477 }
catch (CentralRepoException ex) {
478 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
481 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
486 return correlationAttributeInstance;
514 String md5 = file.getMd5Hash();
515 if (md5 == null || md5.isEmpty() || HashUtility.isNoDataMd5(md5)) {
528 file.getParentPath() + file.
getName(),
530 TskData.FileKnown.UNKNOWN,
533 }
catch (TskCoreException ex) {
534 logger.log(Level.SEVERE, String.format(
"Error querying case database (%s)", file), ex);
536 }
catch (CentralRepoException ex) {
537 logger.log(Level.SEVERE, String.format(
"Error querying central repository (%s)", file), ex);
540 logger.log(Level.WARNING, String.format(
"Error creating correlation attribute instance (%s)", file), ex);
542 }
catch (NoCurrentCaseException ex) {
543 logger.log(Level.SEVERE,
"Error getting current case", ex);
560 switch (file.getType()) {
573 return file.isMetaFlagSet(TskData.TSK_FS_META_FLAG_ENUM.ALLOC);
575 logger.log(Level.WARNING,
"Unexpected file type {0}", file.getType().getName());
static final int EMAIL_TYPE_ID
static final int USBID_TYPE_ID
static String getEmailAddressAttrDisplayName()
static CorrelationAttributeInstance makeCorrAttr(BlackboardArtifact artifact, CorrelationAttributeInstance.Type correlationType, String value)
static final int ICCID_TYPE_ID
CorrelationAttributeUtil()
static Set< Integer > DOMAIN_ARTIFACT_TYPE_IDS
static CorrelationDataSource fromTSKDataSource(CorrelationCase correlationCase, Content dataSource)
static CorrelationAttributeInstance makeCorrAttrFromFile(AbstractFile file)
CorrelationCase getCase(Case autopsyCase)
static final int IMEI_TYPE_ID
static final Logger logger
static List< CorrelationAttributeInstance > makeCorrAttrsForCorrelation(BlackboardArtifact artifact)
static boolean isSupportedAbstractFileType(AbstractFile file)
static void makeCorrAttrsFromCommunicationArtifacts(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact)
static final int DOMAIN_TYPE_ID
static final int PHONE_TYPE_ID
static CorrelationAttributeInstance getCorrAttrForFile(AbstractFile file)
SleuthkitCase getSleuthkitCase()
static void makeCorrAttrFromArtifactAttr(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact artifact, ATTRIBUTE_TYPE artAttrType, int typeId)
CorrelationAttributeInstance getCorrelationAttributeInstance(CorrelationAttributeInstance.Type type, CorrelationCase correlationCase, CorrelationDataSource correlationDataSource, String value, String filePath)
static final List< String > domainsToSkip
static final int MAC_TYPE_ID
int getCorrelationTypeId()
static BlackboardArtifact getCorrAttrSourceArtifact(BlackboardArtifact artifact)
static List< CorrelationAttributeInstance > makeCorrAttrsToSave(BlackboardArtifact artifact)
static final int IMSI_TYPE_ID
synchronized static Logger getLogger(String name)
static void makeCorrAttrFromAcctArtifact(List< CorrelationAttributeInstance > corrAttrInstances, BlackboardArtifact acctArtifact)
CorrelationAttributeInstance.Type getCorrelationTypeById(int typeId)
static Case getCurrentCaseThrows()
static final int SSID_TYPE_ID
CentralRepoAccountType getAccountTypeByName(String accountTypeName)
static CentralRepository getInstance()
static final Set< Integer > SOURCE_TYPES_FOR_CR_INSERT
static final int FILES_TYPE_ID
CentralRepoAccount getOrCreateAccount(CentralRepoAccount.CentralRepoAccountType crAccountType, String accountUniqueID)