Перейти к содержимому
GitHub

Поиск и коллекции

В меню «Поиск» собраны коллекции и рекурсивный поиск по именам и содержимому файлов. И то и другое выводит результаты сортируемым списком с исходным путём каждого файла, и в обоих работают просмотрщик и быстрый просмотр.

  • Ctrl-F: поиск в текущей папке и во всех вложенных. Совпасть должно каждое слово: main rs находит main.rs, а a | b находит любое из двух слов. Слово в нижнем регистре ищется без учёта регистра, а слово с заглавной буквой ищется с учётом регистра. Можно также использовать маски вроде *.log, фразы в кавычках, пути с косой чертой, например src/lib, и -word для исключения совпадений, а также фильтры ext:rs,toml, type:file, type:dir, type:link, size:>10M, size:1M..50M, mod:<7d (изменённые за последнюю неделю), mod:>1y и in:src (папка в любом месте пути). Недавние запросы перечислены под формой, причём сделанные в этой же папке идут первыми; чтобы повторить запрос, щёлкните его или нажмите Ctrl-P и Ctrl-N в поле запроса. Диалог открывается с тем запросом и параметрами, которые вы в нём оставили, и с папкой, где вы сейчас. Имена находятся в любом алфавите независимо от регистра маски, а буквы с диакритикой совпадают, как бы их ни хранила файловая система. Совпадения рядом с папкой поиска появляются первыми, пока остальное дерево ещё читается.
  • Alt-K: добавить отмеченные файлы или текущий файл в коллекцию на другой панели. Коллекция хранит ссылки, поэтому содержимое файлов не копируется.
  • Alt-V: выбрать сохранённую коллекцию в прокручиваемом списке, где для каждой указано число элементов и примерный размер. Чтобы создать новую, нажмите F7 или N. Коллекции сохраняются после перезапуска Borg.
  • Esc: скрыть результаты, сохранив положение курсора, прокрутку, отметки, фильтр и группировку.
  • Alt-Shift-R: снова показать скрытые результаты. Пока результаты скрыты, сканирование продолжается.
  • Alt-D: открыть «Размеры папок», чтобы найти папки по общему размеру или числу файлов. Скрытые файлы по умолчанию учитываются. Alt-D открывает окно Ctrl-F в режиме Итоги по папкам; переключаться между режимами можно в поле Что искать. Ctrl-C останавливает сканирование.
  • Alt-S: подсчитать размеры выбранной папки. Alt-Shift-D: открыть дерево размеров текущей папки.
  • Alt-W: развернуть активную панель результатов или вернуть её обычный размер. По умолчанию результаты открываются в обычной панели. На кнопки [+] (развернуть), [=] (восстановить) и [-] (свернуть) в заголовке можно нажимать мышью. Свёрнутое представление скрывается; Alt-Shift-R возвращает его с прежней раскладкой и выделением.
  • Ctrl-S: отфильтровать результаты по имени или исходному пути. Пустой фильтр показывает всё.

Введите текст в поле С текстом в диалоге Ctrl-F, чтобы получить список файлов внутри папки, где он встречается. Шаблон имени по-прежнему действует, поэтому *.rs вместе с fn main в поле С текстом находит файлы Rust, в которых это есть. Переключатели рядом с полем работают так же, как в панели поиска: Alt-C учитывает регистр (иначе запрос в нижнем регистре находит совпадения в любом регистре), Alt-W ищет целые слова, а Alt-R читает текст как регулярное выражение. Переключатели можно нажимать и мышью. Ctrl-P и Ctrl-N в поле возвращают недавние запросы из панели поиска и прошлых поисков. Поиск по тексту находит только файлы, поэтому не работает с итогами по папкам и минимумом файлов, а в диалоге Размеры папок поля С текстом нет.

Каждый результат показывает первую строку с совпадением и её номер в столбце Совпадение, а строка состояния добавляет номер строки к пути файла. F3 открывает файл в просмотрщике на этом совпадении, и панель поиска уже открыта с запросом, так что Enter переходит к следующему, а Ctrl-Q показывает это место в быстром просмотре с отмеченным запросом. Файлы Markdown и JSON открываются в обоих случаях как исходный текст, потому что поиск читал файл как есть, а s переключает на форматированный вид. F4 открывает файл в редакторе Borg на этом совпадении: совпадение выделено, а панель поиска открыта с запросом. Alt-E делает то же самое на другой панели, так что результаты остаются на виду. Borg читает файлы в фоне, а строка контекста считает прочитанные файлы. Двоичные файлы (байт NUL в первых 8 КиБ) и файлы больше 64 МиБ остаются непрочитанными и считаются двоичными или слишком большими. Ctrl-C останавливает поиск. Как и любой поиск, он заканчивается на 20 000 файлах.

Ctrl-R в результатах или Заменить в файлах… в меню «Файл» заменяет текст в отмеченных файлах, а если ничего не отмечено, то во всех файлах, которые показывают результаты. Введите, чем его заменить, и нажмите Enter; оставьте поле пустым, чтобы удалить текст. Затем Borg задаёт второй вопрос, где названы текст и файлы, и в нём сразу выбрана кнопка Нет. Нажмите Y, чтобы изменить файлы. Копию прежнего текста Borg не сохраняет. Переключатели поиска действуют и здесь: поиск целых слов заменяет целые слова, а в регулярном выражении $1 подставляет первую группу. Borg записывает каждый файл так же, как сохраняет его редактор, поэтому права и ссылки сохраняются. Файлы, которые не являются текстом, больше 32 MiB или изменились во время работы задания, пропускаются. Задание видно в Alt-J, а когда оно заканчивается, результаты обновляются.

Выберите Совпадения правил в поле Что искать диалога Ctrl-F, чтобы проверить файлы внутри папки правилами YARA: теми, что поставляются с Borg, и вашими собственными. Шаблон имени, Минимальный размер и Пропускать результаты сборки, кэши и игнорируемые файлы продолжают действовать. Что искать, решают правила, поэтому в диалоге нет полей С текстом и Минимум файлов.

В столбце Совпадение каждый результат показывает самое серьёзное правило, которому соответствует файл, сколько ещё правил ему соответствуют и первые байты, найденные этим правилом, в виде текста в кавычках или в шестнадцатеричном виде. F3 открывает файл в просмотрщике на этих байтах, и панель поиска уже заполнена ими; F4 и быстрый просмотр открываются там же. Строка контекста считает проверенные файлы и применённые правила. Файлы больше 64 МиБ остаются непрочитанными и считаются слишком большими, а проверка, как и любой поиск, заканчивается на 20 000 файлах. Ctrl-C останавливает её.

Собственные правила Borg ищут:

  • reverse_shell: интерактивную оболочку через /dev/tcp, nc или socat, запускающие оболочку, или оболочку, запущенную на псевдотерминале.
  • download_and_run: скрипт, который скачивается и сразу передаётся оболочке через конвейер.
  • decode_and_run: base64, который декодируется и выполняется как команда оболочки или как код Python.
  • crypto_miner: адрес майнинг-пула или настройки распространённого майнера.
  • upx_packed: исполняемый файл, сжатый UPX, который распаковывает себя в памяти.
  • execve_shellcode: путь к оболочке, который код эксплойта собирает перед запуском оболочки.
  • ssh_key_planted: открытый ключ, дописанный в файл authorized_keys.
  • reboot_job_fetch: задание cron, которое запускается при каждой загрузке и скачивает, декодирует или запускает что-то из временной папки.
  • password_prompt: диалог AppleScript, который запрашивает пароль со скрытым вводом, как это делают программы для кражи данных в macOS.
  • launch_agent_from_temp: агент или демон запуска macOS, который запускает программу из временной или общей папки.
  • preload_write: запись в /etc/ld.so.preload, из-за которой библиотека загружается в каждую программу в Linux.
  • history_wiping: отключённую историю оболочки или очищенные системные журналы.
  • agent_unattended: ИИ-агента для программирования, запущенного с отключёнными подтверждениями, как это делала атака на цепочку поставок Nx, чтобы искать секреты на машинах.
  • hidden_prompt: цепочку невидимых тегов Unicode, в которой можно спрятать инструкции для моделей ИИ в промптах, файлах правил и веб-страницах.
  • pickle_runs_code: pickle, выполняющий команду при загрузке; в этом формате Python и PyTorch сохраняют модели.

Свои правила положите в папку rules рядом с config.toml: ~/.config/borg-commander/rules или такую же папку внутри $XDG_CONFIG_HOME или $BORG_CONFIG_DIR. Borg читает все файлы .yar и .yara в ней и во вложенных папках, каждый в собственном пространстве имён, поэтому в двух файлах могут быть правила с одинаковыми именами. Каждый файл компилируется отдельно. Файл с ошибкой пропускается целиком, строка состояния называет его вместе с сообщением компилятора, строка контекста считает пропущенные файлы, а остальные файлы продолжают работать. Поскольку каждый файл загружается отдельно, файл с include тоже пропускается, а включаемые им файлы работают сами по себе.

Правила могут импортировать модули hash, math, string, time, elf, macho, pe, dotnet и dex; файл, импортирующий magic, cuckoo или console, пропускается. Переменные filename, filepath и extension содержат имя, путь и расширение проверяемого файла, как ожидают наборы правил для THOR и LOKI, а filetype и owner пусты. Метаполе severity правила задаёт важность совпадения: alert, critical или high дают тревогу, warning, medium или suspicious дают предупреждение, а notice, low или info дают замечание. Без него score от 80 даёт тревогу, от 60 даёт предупреждение, а меньшее значение даёт замечание. Правило без обоих полей считается предупреждением. Его поля description и false_positives показываются при каждом совпадении.

Borg не поставляет публичные наборы правил, потому что их лицензии различаются. Скачайте те, которым доверяете, в папку правил и проверьте лицензию каждого, прежде чем использовать его в работе:

  • YARA Forge собирает в проверенные пакеты правила из многих публичных источников; каждое правило сохраняет лицензию своего источника.
  • signature-base бесплатен для некоммерческого использования (CC BY-NC 4.0).
  • Protection artifacts от Elastic распространяются по лицензии Elastic License 2.0.
  • Правила ReversingLabs распространяются по лицензии MIT.

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

Выберите Упакованные программы в поле Что искать диалога Ctrl-F, чтобы найти внутри папки программы, код которых так же плотен, как сжатые или зашифрованные байты. Такой код оставляют упаковщики и протекторы, а также вредоносные программы, которые прячут свой код до запуска. Borg читает те части каждого файла ELF, Mach-O и PE, которые загрузчик отображает в память как исполняемые, включая каждый срез универсального файла Mach-O, и измеряет энтропию до 1024 блоков по 4 КиБ, равномерно распределённых по ним. Программа попадает в список, если не меньше 70% этих блоков достигают 7,2 бит на байт. Код, скомпилированный обычным образом, остаётся намного ниже. Шаблон имени, Минимальный размер и Пропускать результаты сборки, кэши и игнорируемые файлы продолжают действовать, а полей С текстом и Минимум файлов в диалоге нет.

Колонка Совпадение показывает долю блоков с высокой энтропией и наибольшую найденную энтропию, например «высокая: 97% · макс. 8». F3 открывает программу в шестнадцатеричных строках просмотрщика на первом блоке с высокой энтропией, рядом с полосой энтропии, описанной в разделе Просмотрщик и быстрый просмотр. Строка контекста считает прочитанные программы и прочие файлы, в которых Borg не умеет находить код. Ctrl-C останавливает поиск. Как и любой поиск, он заканчивается на 20 000 файлах. Упакованная программа показывает свой настоящий код только во время работы, и Проверка энтропии всех процессов смотрит на программы именно тогда.

Щёлкните заголовок столбца, чтобы отсортировать по нему, и щёлкните ещё раз, чтобы обратить порядок. Сортировка есть и в меню «Левая» и «Правая», а меню «Поиск» добавляет сортировку по исходной папке и группировку по папке или типу файла. Enter на заголовке группы сворачивает её; Insert отмечает подходящие файлы в ней. Отметки сохраняются при сортировке и фильтрации, а нижняя строка учитывает и отмеченные файлы, скрытые фильтром.

F3 и Ctrl-Q открывают исходный файл, а после поиска по тексту открывают его на первом совпадении. Быстрый просмотр следует за курсором по результатам и показывает каждый файл на его совпадении, отмечая запрос так же, как панель поиска. Alt-E открывает файл в редакторе Borg на другой панели, так что результаты остаются на виду. Esc или F10 закрывает этот редактор и возвращает фокус результатам, а быстрый просмотр появляется снова, если был открыт до этого. F5 копирует в настоящую папку; если на другой панели коллекция, F5 вместо этого добавляет в неё ссылки. Для F6 местом назначения должна быть настоящая папка. В коллекции F8 удаляет ссылки, не трогая сами файлы; в результатах поиска F8 предлагает удалить исходные файлы. Shift-F8 после подтверждения удаляет исходные файлы и из коллекции. Если отмечены и папка, и файлы внутри неё, задание обработает папку один раз. Показать оригинал или Alt-O открывает папку файла на другой панели и ставит курсор на файл. Left или Esc скрывает результаты, а Alt-Shift-R возвращает их в том же виде. Tab переключает панели, даже если в оболочке набрана незавершённая команда. Оболочка всегда остаётся в настоящей папке. F10 всегда спрашивает подтверждение перед выходом.

Действия Git и архивов пока работают только на панелях с настоящими папками. Чтобы применить их к файлу из коллекции, сначала откройте его папку командой Показать оригинал.

Поиск читает имена и метаданные файлов в фоновом процессе, который можно отменить, и останавливается на 20 000 совпадений. Строка контекста показывает, завершён ли поиск, были ли ошибки и пропущенные элементы и достигнут ли этот предел. Скрытые папки просматриваются, только если включён параметр Показать скрытые файлы. Поиск не выходит за пределы файловой системы, в которой начат, и не переходит по символическим ссылкам на папки. В окне поиска можно ограничить результаты только файлами или только папками и задать минимальный размер.

Выберите Итоги по папкам, чтобы измерить все файлы в каждой папке перед фильтрацией по имени, размеру или минимальному числу файлов. Borg оставляет 20 000 самых больших подходящих папок и сортирует их по размеру; щёлкните «Файлы», чтобы упорядочить их по числу файлов. Используйте шаблон вроде node_modules или *cache* либо *, чтобы увидеть все папки внутри начальной.

Итоги складываются из размеров содержимого файлов. Удаление папки может освободить на диске другой объём места. Вложенные папки учитываются и в итогах родительских. По символическим ссылкам переход не выполняется, сканирование не выходит за пределы исходной файловой системы, а папка, содержащая саму себя (через bind-монтирование или жёсткую ссылку на папку), учитывается только один раз. Если итог неполон из-за такой границы или потому, что вложенную папку не удалось прочитать или она была пропущена, он помечается знаком ≥. Сканирование папок читает только метаданные и никогда не открывает содержимое файлов. Результаты появляются по завершении измерения, а отменить сканирование можно в любой момент.

Дерево размеров папок показывает на текущей панели итог для начальной папки и её подпапок. Right раскрывает ветку или входит в неё, если она уже раскрыта; Left сворачивает ветку или выделяет родительскую. Enter открывает саму папку. Щёлкните стрелку ветки, чтобы свернуть или раскрыть её, или заголовок столбца, чтобы отсортировать папки одного уровня по имени, размеру или числу файлов. Esc скрывает дерево, а Alt-Shift-R возвращает его ветки, отметки и курсор. Файловые операции работают с настоящими путями, и если отметить и папку, и её подпапку, задание копирования или удаления получит только папку.

Пока отмечен флажок Пропускать результаты сборки, кэши и игнорируемые файлы, поиск по именам пропускает генерируемые папки: node_modules, .git, кэши и виртуальные окружения Python, папки вроде target и dist, лежащие рядом с файлом сборки (Cargo.toml, package.json), и любые папки с файлом CACHEDIR.TAG. Пропускаются и файлы, исключённые через .gitignore, .ignore, .rgignore или .borgignore, а также маски из [search] exclude.

Чтобы изменить, что пропускается, нажмите F4 в окне поиска или щёлкните F4 Изменить. Можно включать и выключать пропуск генерируемых папок и учёт файлов игнорирования, а также добавлять (Ins), изменять (Enter) и удалять (Del) шаблоны. Изменения сохраняются в файле конфигурации. Пропущенная папка всё равно появится, если с запросом совпадает её собственное имя, а строка контекста показывает, сколько папок пропущено. Добавьте к запросу excluded:yes, чтобы один раз поискать везде, или hidden:yes, чтобы включить скрытые файлы. Подсчёт размеров всегда читает всё.

В macOS поиск и подсчёт размеров, начатые выше ~/Library/Containers и ~/Library/Group Containers, пропускают эти папки: при чтении из них macOS задерживает операцию, пока кто-нибудь не ответит, разрешить ли доступ к данным другого приложения. Поиск, начатый внутри одной из этих папок, читает её.

История поиска хранится на этом компьютере, и прочитать её можете только вы. Чтобы не сохранять её, задайте history = false в разделе [search].

Поиск → Индексировать эту папку для мгновенного поиска поддерживает индекс всех имён внутри активной папки, так что Ctrl-F в ней или в любой вложенной папке отвечает сразу. Строка контекста показывает, когда построен индекс. Borg перестраивает индексы в фоне после запуска и всякий раз, когда индексу больше 15 минут, а старый индекс продолжает отвечать, пока новый не готов. Поиск, который ничего не пропускает или использует другие исключения, читает папки напрямую. Так же поступает поиск по тексту, потому что в индексе хранятся только имена. Выберите этот пункт меню ещё раз, чтобы прекратить индексирование и удалить индекс. Индексы хранятся в папке кэша рядом с результатами подсчёта размеров, а раздел [index] конфигурации перечисляет индексируемые папки.

Чтобы измерить размеры, не закрывая обычные файловые панели, нажмите Alt-I или выберите Поиск → Подсчёт размеров в фоне. Borg сканирует все папки внутри текущей, включая скрытые файлы, и заполняет итог каждой папки по мере готовности. Пока идёт подсчёт, можно по-прежнему перемещаться по папкам или работать в консоли. У папок, которые ещё измеряются, показан растущий итог с пометкой ≥, и итоги сохраняются, если уйти из папки и вернуться. Ход подсчёта виден в нижней строке панели; нажмите Alt-I ещё раз или щёлкните нижнюю строку, чтобы остановить сканирование и сохранить уже измеренные итоги. Запуск задания копирования, перемещения или удаления останавливает идущий подсчёт. Завершённые сканирования используют общий кэш с деревом размеров и режимом «Итоги по папкам».

Завершённые сканирования сохраняются на этом компьютере. И «Итоги по папкам», и дерево размеров повторно используют сохранённое сканирование той же папки с той же настройкой скрытых файлов. Когда вы снова открываете уже измеренную папку, сохранённые размеры появляются сразу с пометкой ~, а над деревом указана дата измерения. Ctrl-R запускает повторное сканирование в любом из двух режимов, Ctrl-C отменяет его. Пока идёт обновление, предыдущее дерево остаётся на экране, и оно сохраняется, если новое сканирование отменено или завершилось ошибкой. В обычных списках папок тоже показываются сохранённые итоги, если они есть. Изменения, сделанные вне Borg, могут сделать их устаревшими, а сама навигация никогда не запускает рекурсивное сканирование. Задания копирования, перемещения и удаления в Borg сбрасывают сохранённые сканирования, которые затрагивают изменённые пути.

Локальный кэш SQLite хранит все измеренные папки не более чем для 16 начальных папок. Подпапки ветки загружаются, когда вы её раскрываете. Ветка показывает до 20 000 папок, а «Итоги по папкам» показывают 20 000 самых больших совпадений; эти ограничения отображения не останавливают сканирование и не меняют итоги. Строка «Файлы в этой папке» учитывает байты, хранящиеся непосредственно в раскрытой папке. Ошибки и пропущенные подпапки помечают итоги как неполные. Кэш находится в ~/.cache/borg-commander или в XDG_CACHE_HOME, если эта переменная задана; BORG_CACHE_DIR переопределяет расположение. В кэше хранятся только измерения, которые можно получить заново, и он не связан с коллекциями. Файл с жёсткими ссылками учитывается по одному разу для каждого своего пути. Все размеры измеряют содержимое файлов, поэтому на диске файл может занимать больше или меньше места.

Руководство описывает ветку main · Borg 0.11.0 · 1f6bce6
В последнем выпуске может быть не всё, что здесь описано. Список изменений

Перевод с английского. Будем рады исправлениям. Команды и сочетания клавиш не переводятся.