Пример #1
0
def generate_kwargs_from_parsed_rule(parsed_rule):
    # Generate parsed rule kwargs for saving a rule
    name = parsed_rule['rule_name']
    tags = parsed_rule.get('tags', [])
    scopes = parsed_rule.get('scopes', [])

    # TODO : Update when Plyara moves to clean Python types
    metadata = parsed_rule.get('metadata', {})
    for key, value in metadata.items():
        if value not in ('true', 'false'):
            try:
                value = int(value)
            except ValueError:
                metadata[key] = '"' + value + '"'

    strings = parsed_rule.get('strings', [])
    condition = parsed_rule['condition_terms']

    # TODO : Update when Plyara moves to stripping quotes from detect_imports module
    imports = [imp.strip('"') for imp in Plyara.detect_imports(parsed_rule)]
    comments = parsed_rule.get('comments', [])
    dependencies = Plyara.detect_dependencies(parsed_rule)

    # Calculate hash value of rule strings and condition
    logic_hash = Plyara.generate_logic_hash(parsed_rule)

    # TEMP FIX - Use only a single instance of a metakey
    # until YaraGuardian models and functions can be updated
    for key, value in metadata.items():
        if isinstance(value, list):
            metadata[key] = value[0]

    return {
        'name': name,
        'tags': list(set(tags)),
        'scopes': list(set(scopes)),
        'imports': list(set(imports)),
        'comments': list(set(comments)),
        'metadata': metadata,
        'strings': strings,
        'condition': condition,
        'dependencies': dependencies,
        'logic_hash': logic_hash
    }
Пример #2
0
    def test_detect_dependencies(self):
        with open('tests/data/detect_dependencies_ruleset.yar', 'r') as f:
            inputString = f.read()

        result = Plyara().parse_string(inputString)

        self.assertEqual(Plyara.detect_dependencies(result[0]), [])
        self.assertEqual(Plyara.detect_dependencies(result[1]), [])
        self.assertEqual(Plyara.detect_dependencies(result[2]), [])
        self.assertEqual(Plyara.detect_dependencies(result[3]),
                         ['is__osx', 'priv01', 'priv02', 'priv03', 'priv04'])
        self.assertEqual(Plyara.detect_dependencies(result[4]),
                         ['is__elf', 'priv01', 'priv02', 'priv03', 'priv04'])
        self.assertEqual(Plyara.detect_dependencies(result[5]),
                         ['is__elf', 'is__osx', 'priv01', 'priv02'])
        self.assertEqual(Plyara.detect_dependencies(result[6]),
                         ['is__elf', 'is__osx', 'priv01'])
        self.assertEqual(Plyara.detect_dependencies(result[7]), ['is__elf'])
        self.assertEqual(Plyara.detect_dependencies(result[8]),
                         ['is__osx', 'is__elf'])
        self.assertEqual(Plyara.detect_dependencies(result[9]), ['is__osx'])
        self.assertEqual(Plyara.detect_dependencies(result[10]),
                         ['is__elf', 'is__osx'])
Пример #3
0
    def test_detect_dependencies(self):
        with data_dir.joinpath('detect_dependencies_ruleset.yar').open(
                'r') as fh:
            inputString = fh.read()

        result = Plyara().parse_string(inputString)

        with self.assertWarns(DeprecationWarning):
            self.assertEqual(Plyara.detect_dependencies(result[0]), list())
            self.assertEqual(Plyara.detect_dependencies(result[1]), list())
            self.assertEqual(Plyara.detect_dependencies(result[2]), list())
            self.assertEqual(
                Plyara.detect_dependencies(result[3]),
                ['is__osx', 'priv01', 'priv02', 'priv03', 'priv04'])
            self.assertEqual(
                Plyara.detect_dependencies(result[4]),
                ['is__elf', 'priv01', 'priv02', 'priv03', 'priv04'])
            self.assertEqual(Plyara.detect_dependencies(result[5]),
                             ['is__elf', 'is__osx', 'priv01', 'priv02'])
            self.assertEqual(Plyara.detect_dependencies(result[6]),
                             ['is__elf', 'is__osx', 'priv01'])
            self.assertEqual(Plyara.detect_dependencies(result[7]),
                             ['is__elf'])
            self.assertEqual(Plyara.detect_dependencies(result[8]),
                             ['is__osx', 'is__elf'])
            self.assertEqual(Plyara.detect_dependencies(result[9]),
                             ['is__osx'])
            self.assertEqual(Plyara.detect_dependencies(result[10]),
                             ['is__elf', 'is__osx'])