-
Notifications
You must be signed in to change notification settings - Fork 109
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #3109 from artbear/disableSafeMode2
Правило "Отключение безопасного режима" - DisableSafeMode - ГОТОВО
- Loading branch information
Showing
8 changed files
with
223 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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) --> |
83 changes: 83 additions & 0 deletions
83
.../java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DisableSafeModeDiagnostic.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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(); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
2 changes: 2 additions & 0 deletions
2
.../github/_1c_syntax/bsl/languageserver/diagnostics/DisableSafeModeDiagnostic_en.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
diagnosticMessage=Check the safe mode setting | ||
diagnosticName=Disable safe mode |
2 changes: 2 additions & 0 deletions
2
.../github/_1c_syntax/bsl/languageserver/diagnostics/DisableSafeModeDiagnostic_ru.properties
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
diagnosticMessage=Проверьте отключение безопасного режима | ||
diagnosticName=Отключение безопасного режима |
49 changes: 49 additions & 0 deletions
49
...a/com/github/_1c_syntax/bsl/languageserver/diagnostics/DisableSafeModeDiagnosticTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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
16
src/test/resources/diagnostics/DisableSafeModeDiagnostic.bsl
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
&НаСервере | ||
Процедура Метод() | ||
УстановитьБезопасныйРежим(Ложь); // есть замечание | ||
|
||
Значение = Ложь; | ||
УстановитьБезопасныйРежим(Значение); // есть замечание | ||
|
||
УстановитьБезопасныйРежим(Истина); // нет замечания | ||
|
||
УстановитьОтключениеБезопасногоРежима(Истина); // есть замечание | ||
|
||
Значение = Истина; | ||
УстановитьОтключениеБезопасногоРежима(Значение); // есть замечание | ||
|
||
УстановитьОтключениеБезопасногоРежима(Ложь); // нет замечания | ||
КонецПроцедуры |