Исследовательский центр Positive Research представляет серию статей, знакомящих читателей с мировыми стандартами ИБ в сфере передачи и обработки секьюрити-контента. Центр обладает компетенцией и базой знаний по выявлению и устранению уязвимостей и угроз в информационных системах.
В процессе исследования языка OVAL, про который написано ранее в одной из статей, и концепции SCAP-сканера мы столкнулись с довольно серьезной проблемой, а именно с отсутствием удобных инструментов для создания контента на языке OVAL. Нет, мы не утверждаем, что нет совсем ничего. Есть небольшой набор утилит, представленных на официальном сайте. Большая часть из них платная, остальные же представляют собой не очень удобные решения, больше всего похожие на XML-Notepad. В итоге мы решили создать небольшой необходимый для работы инструмент самостоятельно, используя в качестве языка Python
# UNIVERSAL OVAL OBJECTSДанный класс является базовым для всех основных элементов OVAL.Definition, Test, State и Oval_variable будут являться наследниками этого класса. Для того, чтобы реализовать возможность сравнения элементов, были созданы методы hash() (универсальный для всех) и hashme()(переопределяемый у потомков).
class oval_object(persistent.Persistent):
def __init__(self):
self.id = str()
self.tag = "object"
self.namespace = str()
self.oval = str()
self.version = 0
self.vHash = 0
self.deprecated = False
self.variables = PersistentList()
self.notes = PersistentList()
self.comment = str()
self.signature = str()
def assign_id(self, UniqId):
self.id = "oval:"+self.oval+":obj:"+str(UniqId)
def hash(self):
summ_hash = 0
summ_hash += hash(self.tag)
summ_hash += hash(self.namespace)
summ_hash += hash(self.comment)
for var in self.variables:
if isinstance(var, variable):
summ_hash += var.hashme()
else:
raise Exception("Error input parameters in object variables")
return summ_hash
def hashme(self):
self.vHash = self.hash()
return self.vHash
def clearme(self):
hashmap = PersistentMapping()
for var in self.variables:
var.clearme()
var_hash = var.hashme()
if var_hash not in hashmap.keys():
hashmap[var_hash] = None
else:
self.variables.remove(var)
class variable(persistent.Persistent):Как и в случае с OBJECT, потребовалась функция расчета хэша. Структура класса максимально подогнана к ElementTree.Element, чтобы упростить в будущем выгрузку базы данных в XML-формат.
def __init__(self, tag=str(), body = str(), attributes = None, variables = None):
if not attributes:
self.attributes = PersistentMapping()
if not variables:
self.variables = PersistentList()
if attributes and not isinstance(attributes, PersistentMapping):
attributes = PersistentMapping(attributes)
if variables and not isinstance(variables, PersistentList):
variables = PersistentList(variables)
self.tag = tag
self.body = body
if attributes:
self.attributes = attributes
if variables:
self.variables = variables
self.vHash = 0
def clearme(self):
hashmap = PersistentMapping()
for var in self.variables:
var.clearme()
var_hash = var.hashme()
if var_hash not in hashmap.keys():
hashmap[var_hash] = None
else:
self.variables.remove(var)
def hashme(self):
summ_hash = 0
summ_hash += hash(self.tag)
summ_hash += hash(self.body)
if self.attributes:
for attribute in self.attributes.keys():
summ_hash += hash(attribute) + hash(self.attributes[attribute])
if self.variables:
for var in self.variables:
if isinstance(var, variable):
if var != self:
summ_hash += var.hashme()
else:
raise Exception("Error input parameters in variables. Self append ?")
self.vHash = summ_hash
return self.vHash
def _garbager(self, root):В целом и общем, получились наброски инструментария для работы с OVAL на Python, который может пригодиться при сборке и создании секьюрити-контента. Данный модуль позволяет выполнять сборку секьюрити-контента и «упаковку» его в базу данных с контролем версий и уникальности идентификаторов.
for element in list(root):
self._garbager(element)
root.clear()
del root