/** * Find Security Bugs * Copyright (c) Philippe Arteau, All rights reserved. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3.0 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. */ package com.h3xstream.findsecbugs.injection.custom; import com.h3xstream.findsecbugs.FindSecBugsGlobalConfig; import com.h3xstream.findsecbugs.injection.BasicInjectionDetector; import com.h3xstream.findsecbugs.taintanalysis.Taint; import edu.umd.cs.findbugs.BugReporter; import edu.umd.cs.findbugs.Priorities; import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; public class CustomInjectionDetector extends BasicInjectionDetector { private static final Logger LOG = Logger.getLogger(CustomInjectionDetector.class.getName()); private static final String SYSTEM_PROPERTY = "findsecbugs.injection.sources"; public CustomInjectionDetector(BugReporter bugReporter) { super(bugReporter); List<URL> urls = getSystemProperty(); if (urls.size() > 0) { LOG.info("Loading additional injection sources from " + Arrays.toString(urls.toArray()) + ""); } for(URL url : urls) { try { InputStream in = url.openStream(); loadConfiguredSinks(in, "CUSTOM_INJECTION"); } catch (IOException e) { LOG.log(Level.SEVERE, "Unable to load injection sources from :" + url.toString(), e); } } } @Override protected int getPriority(Taint taint) { if (!taint.isSafe() && taint.hasTag(Taint.Tag.CUSTOM_INJECTION_SAFE)) { return Priorities.IGNORE_PRIORITY; } else { return super.getPriority(taint); } } private List<URL> getSystemProperty() { String propertyValue = FindSecBugsGlobalConfig.getInstance().loadFromSystem(SYSTEM_PROPERTY, ""); if(propertyValue.equals("")) { return new ArrayList<URL>(); } String[] resourcePaths = propertyValue.split(","); List<URL> urls = new ArrayList<URL>(resourcePaths.length); for (String resourcePath : resourcePaths) { File file = new File(resourcePath); if (file.exists()) { try { urls.add(file.toURI().toURL()); } catch (MalformedURLException e) { LOG.log(Level.SEVERE, file + " did not load.", e); //Unlikely if the file exists } } else { URL url = getClass().getResource(resourcePath); if(url != null) { urls.add(url); } } } return urls; } }