Время прочтения: 2 мин.

В ходе аудита исходного кода макросов в файлах расширения «.xlsm» на предмет наличия логинов/паролей в открытом виде была выявлена проблема необходимости ручного анализа большого объёма информации, и как следствие, значительного количества времени и ресурсов, необходимых на проведение данной проверки. Целью проверки было найти логины/пароли для подключения к критичным ресурсам, в особенности к базам данных, что приводит к возникновению риска компрометации пароля, несанкционированного подключения к ресурсам, а также последующей утечки конфиденциальной информации.

В качестве решения было принято использовать автоматизированные методы анализа – скрипт на языке python.

В первую очередь необходимо извлечь исходный код макроса из документа Microsoft Office  c расширением «.xlsm».

Для решения этой задачи был использован метод VBA_Parser библиотеки oletools языка python:

from oletools.olevba3 import VBA_Parser

Далее необходимо было проверить наличие в коде конструкции для подключения к базам данных, а также ключевого слова «password», в котором может содержаться переменная с паролем:

if (("connection" in str(b).lower()) and (("sqloledb" in str(b).lower()) or  ("msdaora" in str(b).lower())  )):
            if (("sspi" not in str(b).lower()) and ("trusted" not in str(b).lower()) and ("integrated" not in str(b).lower())):

При помощи условия, приведённого выше, может быть проверено наличие в коде подключения к базе, не использующего доменную авторизацию, что скорее всего говорит о наличии пароля в самом коде макроса.

Также проверялось наличие в коде ключевого слова «password», которое может свидетельствовать о наличии в коде переменной с паролем:

if ("password" in str(b).lower()):

Полный код скрипта представлен ниже:

from oletools.olevba3 import VBA_Parser
path = 'C:\\Users\\User12\\Documents\\macro__1.xlsm'
vbaparser = VBA_Parser(path)
for (x,c,v,b) in vbaparser.extract_macros():
    if ".frm" not in str(v).lower():
        if (("connection" in str(b).lower()) and (("sqloledb" in str(b).lower()) or  ("msdaora" in str(b).lower())  )):
            if (("sspi" not in str(b).lower()) and ("trusted" not in str(b).lower()) and ("integrated" not in str(b).lower())):
                print ("database connect detected!")
        if ("password" in str(b).lower()):
            print ("password detected    ", c)

В результате отработки скрипта были выбраны макросы, потенциально содержащие логины/пароли, для ручной проверки, что в целом многократно сэкономило время, необходимое на проведение аудита.  Таким образом, применение скрипта позволит проводить периодические проверки макросов и повысить уровень кибербезопасности организации в целом.