Skip to content

Commit c3de02b

Browse files
authored
Merge pull request #89 from lostsnow/feature/policy
Feature/policy
2 parents 7f376fa + eb928ec commit c3de02b

File tree

4 files changed

+424
-96
lines changed

4 files changed

+424
-96
lines changed
Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
from dongtai_agent_python.setting import const
2+
3+
4+
def new_policy_rule(rule_type, detail):
5+
signature = detail.get('value', '')
6+
if signature == '':
7+
return None
8+
if rule_type not in const.NODE_TYPES:
9+
return None
10+
return PolicyRule(rule_type, signature, detail.get('source', None), detail.get('target', None))
11+
12+
13+
class PolicyRule(object):
14+
def __init__(self, rule_type, signature, source=None, target=None):
15+
self.rule_type = rule_type
16+
self.signature = signature
17+
18+
# @TODO: build patch for signature
19+
20+
self.source_from = TaintFrom(const.TAINT_SOURCE, source)
21+
self.target_from = TaintFrom(const.TAINT_TARGET, target)
22+
23+
24+
class TaintFrom(object):
25+
def __init__(self, taint_type, source_or_target):
26+
self.taint_type = taint_type
27+
self.source_or_target = source_or_target
28+
29+
self.from_object = False
30+
self.from_return = False
31+
self.from_all_parameters = False
32+
self.from_args = set()
33+
self.from_kwargs = set()
34+
35+
self.parse_from()
36+
37+
def parse_from(self):
38+
if not self.source_or_target:
39+
if self.taint_type == const.TAINT_SOURCE:
40+
self.from_all_parameters = True
41+
else:
42+
self.from_return = True
43+
return
44+
45+
if self.source_or_target == 'P':
46+
self.from_all_parameters = True
47+
return
48+
49+
splits = self.source_or_target.split('|')
50+
for sp in splits:
51+
if sp == 'O':
52+
self.from_object = True
53+
elif sp == 'R':
54+
self.from_return = True
55+
elif sp.startswith('P'):
56+
if sp == 'P':
57+
self.from_all_parameters = True
58+
if self.from_all_parameters:
59+
continue
60+
61+
sp = sp[1:]
62+
args = sp.split(',')
63+
for arg in args:
64+
if arg.isdigit():
65+
idx = int(arg) - 1
66+
if idx < 0:
67+
continue
68+
self.from_args.add(idx)
69+
else:
70+
self.from_kwargs.add(arg)

0 commit comments

Comments
 (0)