Skip to content

Commit 7161add

Browse files
authored
Merge pull request #3004 from artbear/SetPrivilegedMode
2 parents 1c83f52 + 3bcf69f commit 7161add

File tree

8 files changed

+229
-0
lines changed

8 files changed

+229
-0
lines changed

docs/diagnostics/SetPrivilegedMode.md

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
# Использование привилегированного режима (SetPrivilegedMode)
2+
3+
<!-- Блоки выше заполняются автоматически, не трогать -->
4+
## Описание диагностики
5+
<!-- Описание диагностики заполняется вручную. Необходимо понятным языком описать смысл и схему работу -->
6+
Текущее правило находит код установки привилегированного режима.
7+
Для внешнего кода, например, кода из внешних отчетов\обработок, это действие может быть небезопасным.
8+
9+
По найденным замечаниям необходимо выполнить ручной аудит кода на предмет его правильности и безопасности.
10+
11+
Правило находит вызовы метода `УстановитьПривилегированныйРежим`
12+
вызов `УстановитьПривилегированныйРежим(Ложь)` игнорируется
13+
14+
Потенциально опасны любые экспортные процедуры и функции, которые выполняют на сервере какие-либо действия с предварительной безусловной установкой привилегированного режима, так как это отключает проверку прав доступа текущего пользователя. Особого внимания требуют экспортные процедуры и функции клиентского прикладного программного интерфейса сервера 1С:Предприятия.
15+
16+
Например, неправильно:
17+
```bsl
18+
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
19+
20+
УстановитьПривилегированныйРежим(Истина); // Отключаем проверку прав доступа
21+
// Изменяем данные в привилегированном режиме
22+
...
23+
КонецПроцедуры
24+
```
25+
Правильно:
26+
```bsl
27+
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
28+
29+
// Изменяем данные
30+
// (при этом если у пользователя недостаточно прав для выполнения операции над данными, то будет вызвано исключение)
31+
...
32+
33+
КонецПроцедуры
34+
```
35+
Исключение составляют случаи, когда действие, выполняемое процедурой, должно быть разрешено (или возвращаемое значение функции должно быть доступно) абсолютно всем категориям пользователей.
36+
37+
Если все-таки необходимо использовать привилегированный режим внутри метода, следует использовать проверку прав доступа вручную, следует использовать метод `ВыполнитьПроверкуПравДоступа`.
38+
39+
Пример предварительной проверки перед выполнением действий в привилегированном режиме:
40+
```bsl
41+
Процедура ИзменитьИлиУдалитьДанные(...) Экспорт
42+
43+
ВыполнитьПроверкуПравДоступа(...); // Если у пользователя недостаточно прав, то будет вызвано исключение
44+
УстановитьПривилегированныйРежим(Истина); // Отключаем проверку прав доступа
45+
46+
// Изменяем данные в привилегированном режиме
47+
...
48+
КонецПроцедуры
49+
```
50+
## Примеры
51+
<!-- В данном разделе приводятся примеры, на которые диагностика срабатывает, а также можно привести пример, как можно исправить ситуацию -->
52+
```bsl
53+
УстановитьПривилегированныйРежим(Истина); // есть замечание
54+
55+
Значение = Истина;
56+
УстановитьПривилегированныйРежим(Значение); // есть замечание
57+
58+
УстановитьПривилегированныйРежим(Ложь); // нет замечания
59+
```
60+
## Источники
61+
<!-- Необходимо указывать ссылки на все источники, из которых почерпнута информация для создания диагностики -->
62+
<!-- Примеры источников
63+
64+
* Источник: [Стандарт: Тексты модулей](https://its.1c.ru/db/v8std#content:456:hdoc)
65+
* Полезная информация: [Отказ от использования модальных окон](https://its.1c.ru/db/metod8dev#content:5272:hdoc)
66+
* Источник: [Cognitive complexity, ver. 1.4](https://www.sonarsource.com/docs/CognitiveComplexity.pdf) -->
67+
* Источник: [Стандарт: Использование привилегированного режима](https://its.1c.ru/db/v8std/content/485/hdoc)
68+
* Источник: [Стандарт: Безопасность прикладного программного интерфейса сервера](https://its.1c.ru/db/v8std#content:678:hdoc)
69+
* Источник: [Стандарт: Ограничение на выполнение «внешнего» кода](https://its.1c.ru/db/v8std/content/669/hdoc)
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# Using privileged mode (SetPrivilegedMode)
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: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
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.SECURITY_HOTSPOT,
37+
severity = DiagnosticSeverity.MAJOR,
38+
minutesToFix = 1,
39+
tags = {
40+
DiagnosticTag.SUSPICIOUS
41+
},
42+
scope = DiagnosticScope.BSL
43+
)
44+
45+
public class SetPrivilegedModeDiagnostic extends AbstractFindMethodDiagnostic {
46+
private static final Pattern messagePattern = CaseInsensitivePattern.compile(
47+
"УстановитьПривилегированныйРежим|SetPrivilegedMode");
48+
49+
public SetPrivilegedModeDiagnostic() {
50+
super(messagePattern);
51+
}
52+
53+
@Override
54+
protected boolean checkGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) {
55+
final var result = super.checkGlobalMethodCall(ctx);
56+
if (result && (isSetPrivilegedModeWithFalse(ctx))) {
57+
return false;
58+
}
59+
return result;
60+
}
61+
62+
private static boolean isSetPrivilegedModeWithFalse(BSLParser.GlobalMethodCallContext ctx) {
63+
return Optional.of(ctx)
64+
.map(BSLParser.GlobalMethodCallContext::doCall)
65+
.map(BSLParser.DoCallContext::callParamList)
66+
.map(BSLParser.CallParamListContext::callParam)
67+
.filter(callParamContexts -> callParamContexts.size() == 1)
68+
.map(callParamContexts -> callParamContexts.get(0))
69+
.map(BSLParser.CallParamContext::expression)
70+
.map(BSLParser.ExpressionContext::member)
71+
.map(memberContexts -> memberContexts.get(0))
72+
.map(BSLParser.MemberContext::constValue)
73+
.filter(constValueContext -> constValueContext.FALSE() != null)
74+
.isPresent();
75+
}
76+
}

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
@@ -1664,6 +1664,16 @@
16641664
},
16651665
"$id": "#/definitions/SetPermissionsForNewObjects"
16661666
},
1667+
"SetPrivilegedMode": {
1668+
"description": "Using privileged mode",
1669+
"default": true,
1670+
"type": [
1671+
"boolean",
1672+
"object"
1673+
],
1674+
"title": "Using privileged mode",
1675+
"$id": "#/definitions/SetPrivilegedMode"
1676+
},
16671677
"SeveralCompilerDirectives": {
16681678
"description": "Erroneous indication of several compilation directives",
16691679
"default": true,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Check the privileged mode setting
2+
diagnosticName=Using privileged mode
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
diagnosticMessage=Проверьте установку привилегированного режима
2+
diagnosticName=Использование привилегированного режима
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
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 SetPrivilegedModeDiagnosticTest extends AbstractDiagnosticTest<SetPrivilegedModeDiagnostic> {
32+
SetPrivilegedModeDiagnosticTest() {
33+
super(SetPrivilegedModeDiagnostic.class);
34+
}
35+
36+
@Test
37+
void test() {
38+
39+
List<Diagnostic> diagnostics = getDiagnostics();
40+
41+
assertThat(diagnostics, true)
42+
.hasRange(2, 4, 36)
43+
.hasRange(4, 4, 36)
44+
.hasSize(2);
45+
}
46+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
&НаСервере
2+
Процедура Метод()
3+
УстановитьПривилегированныйРежим(Истина); // есть замечание
4+
Значение = Истина;
5+
УстановитьПривилегированныйРежим(Значение); // есть замечание
6+
7+
УстановитьПривилегированныйРежим(Ложь); // нет замечания
8+
КонецПроцедуры

0 commit comments

Comments
 (0)