Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
K
kernel-hardening-checker
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
fact-depend
kernel-hardening-checker
Commits
cbd83d73
Commit
cbd83d73
authored
Oct 21, 2020
by
Alexander Popov
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Add nested ComplexOptChecks support
Now we can do things like OR(opt1, AND(opt2, opt3)). Cool! Refers to #48
parent
150c5ae7
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
24 additions
and
5 deletions
+24
-5
__init__.py
kconfig_hardened_check/__init__.py
+24
-5
No files found.
kconfig_hardened_check/__init__.py
View file @
cbd83d73
...
@@ -146,6 +146,10 @@ class PresenceCheck:
...
@@ -146,6 +146,10 @@ class PresenceCheck:
class
ComplexOptCheck
:
class
ComplexOptCheck
:
def
__init__
(
self
,
*
opts
):
def
__init__
(
self
,
*
opts
):
self
.
opts
=
opts
self
.
opts
=
opts
if
not
self
.
opts
:
sys
.
exit
(
'[!] ERROR: empty {} check'
.
format
(
self
.
__class__
.
__name__
))
if
not
isinstance
(
opts
[
0
],
OptCheck
):
sys
.
exit
(
'[!] ERROR: invalid {} check: {}'
.
format
(
self
.
__class__
.
__name__
,
opts
))
self
.
result
=
None
self
.
result
=
None
@property
@property
...
@@ -192,9 +196,13 @@ class OR(ComplexOptCheck):
...
@@ -192,9 +196,13 @@ class OR(ComplexOptCheck):
for
i
,
opt
in
enumerate
(
self
.
opts
):
for
i
,
opt
in
enumerate
(
self
.
opts
):
ret
=
opt
.
check
()
ret
=
opt
.
check
()
if
ret
:
if
ret
:
if
i
==
0
or
not
hasattr
(
opt
,
'expected'
):
if
opt
.
result
!=
'OK'
or
i
==
0
:
# Preserve additional explanation of this OK result.
# Simple OK is enough only for the main option that
# this OR-check is about.
self
.
result
=
opt
.
result
self
.
result
=
opt
.
result
else
:
else
:
# Simple OK is not enough for additional checks.
self
.
result
=
'OK: CONFIG_{} "{}"'
.
format
(
opt
.
name
,
opt
.
expected
)
self
.
result
=
'OK: CONFIG_{} "{}"'
.
format
(
opt
.
name
,
opt
.
expected
)
return
True
return
True
self
.
result
=
self
.
opts
[
0
]
.
result
self
.
result
=
self
.
opts
[
0
]
.
result
...
@@ -215,9 +223,13 @@ class AND(ComplexOptCheck):
...
@@ -215,9 +223,13 @@ class AND(ComplexOptCheck):
self
.
result
=
opt
.
result
self
.
result
=
opt
.
result
return
ret
return
ret
if
not
ret
:
if
not
ret
:
if
hasattr
(
opt
,
'expected'
):
# This FAIL is caused by additional checks,
# and not by the main option that this AND-check is about.
if
opt
.
result
.
startswith
(
'FAIL:
\"
'
):
# Describe the reason of the FAIL.
self
.
result
=
'FAIL: CONFIG_{} not "{}"'
.
format
(
opt
.
name
,
opt
.
expected
)
self
.
result
=
'FAIL: CONFIG_{} not "{}"'
.
format
(
opt
.
name
,
opt
.
expected
)
else
:
else
:
# This FAIL message is self-explaining.
self
.
result
=
opt
.
result
self
.
result
=
opt
.
result
return
False
return
False
...
@@ -577,23 +589,30 @@ def print_checklist(mode, checklist, with_results):
...
@@ -577,23 +589,30 @@ def print_checklist(mode, checklist, with_results):
print
(
'[+] Config check is finished:
\'
OK
\'
- {}{} /
\'
FAIL
\'
- {}{}'
.
format
(
ok_count
,
ok_suppressed
,
fail_count
,
fail_suppressed
))
print
(
'[+] Config check is finished:
\'
OK
\'
- {}{} /
\'
FAIL
\'
- {}{}'
.
format
(
ok_count
,
ok_suppressed
,
fail_count
,
fail_suppressed
))
def
perform_checks
(
checklist
,
parsed_options
,
kernel_version
):
def
perform_check
(
opt
,
parsed_options
,
kernel_version
):
for
opt
in
checklist
:
if
hasattr
(
opt
,
'opts'
):
if
hasattr
(
opt
,
'opts'
):
# prepare ComplexOptCheck
# prepare ComplexOptCheck
for
o
in
opt
.
opts
:
for
o
in
opt
.
opts
:
if
hasattr
(
o
,
'opts'
):
# Recursion for nested ComplexOptChecks
perform_check
(
o
,
parsed_options
,
kernel_version
)
if
hasattr
(
o
,
'state'
):
if
hasattr
(
o
,
'state'
):
o
.
state
=
parsed_options
.
get
(
o
.
name
,
None
)
o
.
state
=
parsed_options
.
get
(
o
.
name
,
None
)
if
hasattr
(
o
,
'ver'
):
if
hasattr
(
o
,
'ver'
):
o
.
ver
=
kernel_version
o
.
ver
=
kernel_version
else
:
else
:
# prepare simple check
# prepare simple check
, opt.state is mandatory
if
not
hasattr
(
opt
,
'state'
):
if
not
hasattr
(
opt
,
'state'
):
sys
.
exit
(
'[!] ERROR: bad simple check {}'
.
format
(
vars
(
opt
)))
sys
.
exit
(
'[!] ERROR: bad simple check {}'
.
format
(
vars
(
opt
)))
opt
.
state
=
parsed_options
.
get
(
opt
.
name
,
None
)
opt
.
state
=
parsed_options
.
get
(
opt
.
name
,
None
)
opt
.
check
()
opt
.
check
()
def
perform_checks
(
checklist
,
parsed_options
,
kernel_version
):
for
opt
in
checklist
:
perform_check
(
opt
,
parsed_options
,
kernel_version
)
def
parse_config_file
(
parsed_options
,
fname
):
def
parse_config_file
(
parsed_options
,
fname
):
with
open
(
fname
,
'r'
)
as
f
:
with
open
(
fname
,
'r'
)
as
f
:
opt_is_on
=
re
.
compile
(
"CONFIG_[a-zA-Z0-9_]*=[a-zA-Z0-9_
\"
]*"
)
opt_is_on
=
re
.
compile
(
"CONFIG_[a-zA-Z0-9_]*=[a-zA-Z0-9_
\"
]*"
)
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment