Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Правило "Отключение безопасного режима" - DisableSafeMode - ГОТОВО #3109

Merged
merged 3 commits into from
Apr 16, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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-объектов), которые могут нанести вред компьютерам пользователей, серверным компьютерам, а также данным в программе.

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

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

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

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

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

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

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

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

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

## Источники
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
<!-- Примеры источников

* Источник: [Стандарт: Тексты модулей](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)
theshadowco marked this conversation as resolved.
Show resolved Hide resolved
.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 @@ -500,6 +500,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 @@
&НаСервере
Процедура Метод()
УстановитьБезопасныйРежим(Ложь); // есть замечание

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

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

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

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

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