Skip to content

Commit

Permalink
Merge pull request #3109 from artbear/disableSafeMode2
Browse files Browse the repository at this point in the history
Правило "Отключение безопасного режима" - DisableSafeMode - ГОТОВО
  • Loading branch information
theshadowco authored Apr 16, 2024
2 parents 1173dc0 + 49d04eb commit 30f1c3e
Show file tree
Hide file tree
Showing 8 changed files with 223 additions and 0 deletions.
45 changes: 45 additions & 0 deletions docs/diagnostics/DisableSafeMode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
# Отключение безопасного режима (DisableSafeMode)

<!-- Блоки выше заполняются автоматически, не трогать -->
## Описание диагностики
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
Помимо программного кода конфигурации, в прикладном решении может исполняться сторонний программный код, который может быть подключен с помощью внешних отчетов, внешних обработок, расширений конфигурации, внешних компонент или другими способами, например, с помощью стороннего (по отношению к конфигурации) программного кода, надежность которого разработчик гарантировать не может (далее – внешний код). При этом злоумышленник может предусмотреть в нем различные деструктивные действия (как в самом внешнем коде, так и опосредовано, через запуск внешних приложений, внешних компонент, COM-объектов), которые могут нанести вред компьютерам пользователей, серверным компьютерам, а также данным в программе.

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

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

Правило диагностирует вызовы методов ` УстановитьБезопасныйРежим` и `УстановитьОтключениеБезопасногоРежима` в режиме отключения контроля безопасного режима
- вызов `УстановитьБезопасныйРежим (Истина)` игнорируется
- вызов `УстановитьОтключениеБезопасногоРежима(Ложь)` игнорируется

## Примеры
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
```
УстановитьБезопасныйРежим (Ложь); // есть замечание
Значение = Ложь;
УстановитьБезопасныйРежим (Значение); // есть замечание
УстановитьБезопасныйРежим (Истина); // нет замечания
УстановитьОтключениеБезопасногоРежима(Истина); // есть замечание
Значение = Истина;
УстановитьОтключениеБезопасногоРежима(Значение); // есть замечание
УстановитьОтключениеБезопасногоРежима(Ложь); // нет замечания
```

## Источники
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
<!-- Примеры источников
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
- [Статья "Безопасный режим работы" - руководство разработчика 1С 8.3.22](https://its.1c.ru/db/v8322doc#bookmark:dev:TI000000186@ee788d9)
- [Стандарт "Ограничение на выполнение «внешнего» кода"](https://its.1c.ru/db/v8std/content/669/hdoc)
- [Стандарт "Безопасность прикладного программного интерфейса сервера"](https://its.1c.ru/db/v8std/content/678/hdoc)
- [Стандарт "Ограничения на использование Выполнить и Вычислить на сервере"](https://its.1c.ru/db/v8std#content:770:hdoc)
- [Стандарт Использование привилегированного режима](https://its.1c.ru/db/v8std/content/485/hdoc)
16 changes: 16 additions & 0 deletions docs/en/diagnostics/DisableSafeMode.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
# Disable safe mode (DisableSafeMode)

<!-- Блоки выше заполняются автоматически, не трогать -->
## Description
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->

## Examples
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->

## Sources
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
<!-- Примеры источников
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
package com.github._1c_syntax.bsl.languageserver.diagnostics;

import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope;
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
import com.github._1c_syntax.bsl.parser.BSLParser;
import com.github._1c_syntax.utils.CaseInsensitivePattern;

import java.util.Optional;
import java.util.regex.Pattern;

@DiagnosticMetadata(
type = DiagnosticType.VULNERABILITY,
severity = DiagnosticSeverity.MAJOR,
minutesToFix = 15,
tags = {
DiagnosticTag.SUSPICIOUS
},
scope = DiagnosticScope.BSL
)
public class DisableSafeModeDiagnostic extends AbstractFindMethodDiagnostic {
private static final Pattern methodPattern = CaseInsensitivePattern.compile(
"УстановитьБезопасныйРежим|SetSafeMode|УстановитьОтключениеБезопасногоРежима|SetSafeModeDisabled");
private static final Pattern safeModePattern = CaseInsensitivePattern.compile(
"УстановитьБезопасныйРежим|SetSafeMode");

public DisableSafeModeDiagnostic() {
super(methodPattern);
}

@Override
protected boolean checkGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) {
final var result = super.checkGlobalMethodCall(ctx);
if (!result) {
return false;
}
final int enabledValue;
if(safeModePattern.matcher(ctx.methodName().getText()).matches()){
enabledValue = BSLParser.TRUE;
} else {
enabledValue = BSLParser.FALSE;
}
return !enabledCall(ctx, enabledValue);
}

private static boolean enabledCall(BSLParser.GlobalMethodCallContext ctx, int enabledValue) {
return Optional.of(ctx)
.map(BSLParser.GlobalMethodCallContext::doCall)
.map(BSLParser.DoCallContext::callParamList)
.map(BSLParser.CallParamListContext::callParam)
.filter(callParamContexts -> callParamContexts.size() == 1)
.map(callParamContexts -> callParamContexts.get(0))
.map(BSLParser.CallParamContext::expression)
.map(BSLParser.ExpressionContext::member)
.map(memberContexts -> memberContexts.get(0))
.map(BSLParser.MemberContext::constValue)
.filter(constValueContext -> constValueContext.getToken(enabledValue, 0) != null)
.isPresent();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -516,6 +516,16 @@
"title": "Deprecated ManagedForm type",
"$id": "#/definitions/DeprecatedTypeManagedForm"
},
"DisableSafeMode": {
"description": "Disable safe mode",
"default": true,
"type": [
"boolean",
"object"
],
"title": "Disable safe mode",
"$id": "#/definitions/DisableSafeMode"
},
"DuplicateRegion": {
"description": "Duplicate regions",
"default": true,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
diagnosticMessage=Check the safe mode setting
diagnosticName=Disable safe mode
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
diagnosticMessage=Проверьте отключение безопасного режима
diagnosticName=Отключение безопасного режима
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
/*
* This file is a part of BSL Language Server.
*
* Copyright (c) 2018-2023
* Alexey Sosnoviy <[email protected]>, Nikita Fedkin <[email protected]> and contributors
*
* SPDX-License-Identifier: LGPL-3.0-or-later
*
* BSL Language Server is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 3.0 of the License, or (at your option) any later version.
*
* BSL Language Server is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with BSL Language Server.
*/
package com.github._1c_syntax.bsl.languageserver.diagnostics;

import org.eclipse.lsp4j.Diagnostic;
import org.junit.jupiter.api.Test;

import java.util.List;

import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;

class DisableSafeModeDiagnosticTest extends AbstractDiagnosticTest<DisableSafeModeDiagnostic> {
DisableSafeModeDiagnosticTest() {
super(DisableSafeModeDiagnostic.class);
}

@Test
void test() {

List<Diagnostic> diagnostics = getDiagnostics();

assertThat(diagnostics, true)
.hasRange(2, 4, 29)
.hasRange(5, 4, 29)
.hasRange(9, 4, 41)
.hasRange(12, 4, 41)
.hasSize(4);

}
}
16 changes: 16 additions & 0 deletions src/test/resources/diagnostics/DisableSafeModeDiagnostic.bsl
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
&НаСервере
Процедура Метод()
УстановитьБезопасныйРежим(Ложь); // есть замечание

Значение = Ложь;
УстановитьБезопасныйРежим(Значение); // есть замечание

УстановитьБезопасныйРежим(Истина); // нет замечания

УстановитьОтключениеБезопасногоРежима(Истина); // есть замечание

Значение = Истина;
УстановитьОтключениеБезопасногоРежима(Значение); // есть замечание

УстановитьОтключениеБезопасногоРежима(Ложь); // нет замечания
КонецПроцедуры

0 comments on commit 30f1c3e

Please sign in to comment.