Skip to content

Commit 30f1c3e

Browse files
authored
Merge pull request #3109 from artbear/disableSafeMode2
Правило "Отключение безопасного режима" - DisableSafeMode - ГОТОВО
2 parents 1173dc0 + 49d04eb commit 30f1c3e

File tree

8 files changed

+223
-0
lines changed

8 files changed

+223
-0
lines changed
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
# Отключение безопасного режима (DisableSafeMode)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Описание диагностики
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
Помимо программного кода конфигурации, в прикладном решении может исполняться сторонний программный код, который может быть подключен с помощью внешних отчетов, внешних обработок, расширений конфигурации, внешних компонент или другими способами, например, с помощью стороннего (по отношению к конфигурации) программного кода, надежность которого разработчик гарантировать не может (далее – внешний код). При этом злоумышленник может предусмотреть в нем различные деструктивные действия (как в самом внешнем коде, так и опосредовано, через запуск внешних приложений, внешних компонент, COM-объектов), которые могут нанести вред компьютерам пользователей, серверным компьютерам, а также данным в программе.
7+
8+
Перечисленные проблемы безопасности особенно критичны при работе конфигураций в модели сервиса. Например, получив доступ к сервису, вредоносный код может получить доступ сразу ко всем приложениям всех пользователей сервиса.
9+
10+
Поэтому важно контролировать выполнение подобного внешнего кода в безопасном режиме, в исключительных случаях точечно разрешая выполнять код в небезопасном режиме после верификации кода.
11+
12+
Правило диагностирует вызовы методов ` УстановитьБезопасныйРежим` и `УстановитьОтключениеБезопасногоРежима` в режиме отключения контроля безопасного режима
13+
- вызов `УстановитьБезопасныйРежим (Истина)` игнорируется
14+
- вызов `УстановитьОтключениеБезопасногоРежима(Ложь)` игнорируется
15+
16+
## Примеры
17+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
18+
```
19+
УстановитьБезопасныйРежим (Ложь); // есть замечание
20+
21+
Значение = Ложь;
22+
УстановитьБезопасныйРежим (Значение); // есть замечание
23+
24+
УстановитьБезопасныйРежим (Истина); // нет замечания
25+
26+
УстановитьОтключениеБезопасногоРежима(Истина); // есть замечание
27+
28+
Значение = Истина;
29+
УстановитьОтключениеБезопасногоРежима(Значение); // есть замечание
30+
31+
УстановитьОтключениеБезопасногоРежима(Ложь); // нет замечания
32+
```
33+
34+
## Источники
35+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
36+
<!-- Примеры источников
37+
38+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
39+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
40+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
41+
- [Статья "Безопасный режим работы" - руководство разработчика 1С 8.3.22](https://its.1c.ru/db/v8322doc#bookmark:dev:TI000000186@ee788d9)
42+
- [Стандарт "Ограничение на выполнение «внешнего» кода"](https://its.1c.ru/db/v8std/content/669/hdoc)
43+
- [Стандарт "Безопасность прикладного программного интерфейса сервера"](https://its.1c.ru/db/v8std/content/678/hdoc)
44+
- [Стандарт "Ограничения на использование Выполнить и Вычислить на сервере"](https://its.1c.ru/db/v8std#content:770:hdoc)
45+
- [Стандарт Использование привилегированного режима](https://its.1c.ru/db/v8std/content/485/hdoc)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Disable safe mode (DisableSafeMode)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Description
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
7+
## Examples
8+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
9+
10+
## Sources
11+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
12+
<!-- Примеры источников
13+
14+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
15+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
16+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata;
25+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope;
26+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity;
27+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag;
28+
import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType;
29+
import com.github._1c_syntax.bsl.parser.BSLParser;
30+
import com.github._1c_syntax.utils.CaseInsensitivePattern;
31+
32+
import java.util.Optional;
33+
import java.util.regex.Pattern;
34+
35+
@DiagnosticMetadata(
36+
type = DiagnosticType.VULNERABILITY,
37+
severity = DiagnosticSeverity.MAJOR,
38+
minutesToFix = 15,
39+
tags = {
40+
DiagnosticTag.SUSPICIOUS
41+
},
42+
scope = DiagnosticScope.BSL
43+
)
44+
public class DisableSafeModeDiagnostic extends AbstractFindMethodDiagnostic {
45+
private static final Pattern methodPattern = CaseInsensitivePattern.compile(
46+
"УстановитьБезопасныйРежим|SetSafeMode|УстановитьОтключениеБезопасногоРежима|SetSafeModeDisabled");
47+
private static final Pattern safeModePattern = CaseInsensitivePattern.compile(
48+
"УстановитьБезопасныйРежим|SetSafeMode");
49+
50+
public DisableSafeModeDiagnostic() {
51+
super(methodPattern);
52+
}
53+
54+
@Override
55+
protected boolean checkGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) {
56+
final var result = super.checkGlobalMethodCall(ctx);
57+
if (!result) {
58+
return false;
59+
}
60+
final int enabledValue;
61+
if(safeModePattern.matcher(ctx.methodName().getText()).matches()){
62+
enabledValue = BSLParser.TRUE;
63+
} else {
64+
enabledValue = BSLParser.FALSE;
65+
}
66+
return !enabledCall(ctx, enabledValue);
67+
}
68+
69+
private static boolean enabledCall(BSLParser.GlobalMethodCallContext ctx, int enabledValue) {
70+
return Optional.of(ctx)
71+
.map(BSLParser.GlobalMethodCallContext::doCall)
72+
.map(BSLParser.DoCallContext::callParamList)
73+
.map(BSLParser.CallParamListContext::callParam)
74+
.filter(callParamContexts -> callParamContexts.size() == 1)
75+
.map(callParamContexts -> callParamContexts.get(0))
76+
.map(BSLParser.CallParamContext::expression)
77+
.map(BSLParser.ExpressionContext::member)
78+
.map(memberContexts -> memberContexts.get(0))
79+
.map(BSLParser.MemberContext::constValue)
80+
.filter(constValueContext -> constValueContext.getToken(enabledValue, 0) != null)
81+
.isPresent();
82+
}
83+
}

src/main/resources/com/github/_1c_syntax/bsl/languageserver/configuration/parameters-schema.json

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,16 @@
516516
"title": "Deprecated ManagedForm type",
517517
"$id": "#/definitions/DeprecatedTypeManagedForm"
518518
},
519+
"DisableSafeMode": {
520+
"description": "Disable safe mode",
521+
"default": true,
522+
"type": [
523+
"boolean",
524+
"object"
525+
],
526+
"title": "Disable safe mode",
527+
"$id": "#/definitions/DisableSafeMode"
528+
},
519529
"DuplicateRegion": {
520530
"description": "Duplicate regions",
521531
"default": true,
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Check the safe mode setting
2+
diagnosticName=Disable safe mode
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Проверьте отключение безопасного режима
2+
diagnosticName=Отключение безопасного режима
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
/*
2+
* This file is a part of BSL Language Server.
3+
*
4+
* Copyright (c) 2018-2023
5+
* Alexey Sosnoviy <labotamy@gmail.com>, Nikita Fedkin <nixel2007@gmail.com> and contributors
6+
*
7+
* SPDX-License-Identifier: LGPL-3.0-or-later
8+
*
9+
* BSL Language Server is free software; you can redistribute it and/or
10+
* modify it under the terms of the GNU Lesser General Public
11+
* License as published by the Free Software Foundation; either
12+
* version 3.0 of the License, or (at your option) any later version.
13+
*
14+
* BSL Language Server is distributed in the hope that it will be useful,
15+
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17+
* Lesser General Public License for more details.
18+
*
19+
* You should have received a copy of the GNU Lesser General Public
20+
* License along with BSL Language Server.
21+
*/
22+
package com.github._1c_syntax.bsl.languageserver.diagnostics;
23+
24+
import org.eclipse.lsp4j.Diagnostic;
25+
import org.junit.jupiter.api.Test;
26+
27+
import java.util.List;
28+
29+
import static com.github._1c_syntax.bsl.languageserver.util.Assertions.assertThat;
30+
31+
class DisableSafeModeDiagnosticTest extends AbstractDiagnosticTest<DisableSafeModeDiagnostic> {
32+
DisableSafeModeDiagnosticTest() {
33+
super(DisableSafeModeDiagnostic.class);
34+
}
35+
36+
@Test
37+
void test() {
38+
39+
List<Diagnostic> diagnostics = getDiagnostics();
40+
41+
assertThat(diagnostics, true)
42+
.hasRange(2, 4, 29)
43+
.hasRange(5, 4, 29)
44+
.hasRange(9, 4, 41)
45+
.hasRange(12, 4, 41)
46+
.hasSize(4);
47+
48+
}
49+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
&НаСервере
2+
Процедура Метод()
3+
УстановитьБезопасныйРежим(Ложь); // есть замечание
4+
5+
Значение = Ложь;
6+
УстановитьБезопасныйРежим(Значение); // есть замечание
7+
8+
УстановитьБезопасныйРежим(Истина); // нет замечания
9+
10+
УстановитьОтключениеБезопасногоРежима(Истина); // есть замечание
11+
12+
Значение = Истина;
13+
УстановитьОтключениеБезопасногоРежима(Значение); // есть замечание
14+
15+
УстановитьОтключениеБезопасногоРежима(Ложь); // нет замечания
16+
КонецПроцедуры

0 commit comments

Comments
 (0)