Skip to content

πŸ”΄ ПолноС Code Review: Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, АрхитСктура, ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠ΄Π°Β #3

Description

@lkaliturin220-svg

ПолноС Code Review: BusEngine (BuslikDrev/BusEngine)

Автор: Π‘ΡƒΡΠ»Ρ–ΠΊΠ”Ρ€ΡΡž
ЛицСнзия: MIT
Π―Π·Ρ‹ΠΊ: C# (.NET Framework 4.7.1+, netstandard2.0)
Π Π°Π·ΠΌΠ΅Ρ€ рСпозитория: ~250MB (Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΈ MSBuild + Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ)
Π‘Ρ‚Ρ€ΠΎΠΊ C# ΠΊΠΎΠ΄Π°: ~23,000


πŸ”΄ CRITICAL β€” Π‘Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ

1. RCE (Remote Code Execution) Ρ‡Π΅Ρ€Π΅Π· Process.Start ΠΈΠ· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°

Π€Π°ΠΉΠ»: BusEngine/Code/Plugin/Program.cs, строка 151

} else if (t == "_linkgo|") {
    System.Diagnostics.Process.Start(message.Substring(8));

Π‘ΠΎΠΎΠ±Ρ‰Π΅Π½ΠΈΠ΅ message ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ ΠΈΠ· встроСнного CefSharp-Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π° Ρ‡Π΅Ρ€Π΅Π· колбэк OnPostMessage. Π›ΡŽΠ±Π°Ρ Π²Π΅Π±-страница, загруТСнная Π² Π΄Π²ΠΈΠΆΠΎΠΊ, ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½Ρ‹ΠΉ процСсс Π½Π° хостС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ. Достаточно Ρ‡Ρ‚ΠΎΠ±Ρ‹ JavaScript Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΈΠ³Ρ€Ρ‹ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΠ» _linkgo|cmd.exe /c ... β€” ΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π° выполнится.

Π‘Ρ‚Π΅ΠΏΠ΅Π½ΡŒ опасности: ΠΏΠΎΠ»Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒ Π½Π°Π΄ машиной ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.
Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅: whitelist Ρ€Π°Π·Ρ€Π΅ΡˆΡ‘Π½Π½Ρ‹Ρ… URL/ΠΏΡ€ΠΎΡ‚ΠΎΠΊΠΎΠ»ΠΎΠ², НЕ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Ρ‚ΡŒ сырой ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠΉ Π²Π²ΠΎΠ΄ Π² Process.Start.

Аналогичная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π² ΡˆΠ°Π±Π»ΠΎΠ½Π°Ρ…:

  • Templates/cs/Launcher/Code/Plugin/Program.cs:132
  • Templates/cs/CubesOpenGL/Code/CubesOpenGL/Program.cs:1913 (Π±ΠΎΠ»Π΅Π΅ бСзопасный Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ с ProcessStartInfo, Π½ΠΎ всё Ρ€Π°Π²Π½ΠΎ Π±Π΅Π· Π²Π°Π»ΠΈΠ΄Π°Ρ†ΠΈΠΈ)

2. WMI Injection

Π€Π°ΠΉΠ»: BusEngine/Code/BusEngine/BusEngine.cs, строка 2555

query.Query = new ObjectQuery(
    "SELECT * FROM Win32_LogicalDisk WHERE Name='" + 
    BusEngine.Engine.EngineDirectory.Substring(0, 2) + "' OR Name='" + 
    BusEngine.Engine.EditorDirectory.Substring(0, 2) + "'");

ΠšΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΡ Π½Π΅ΠΏΡ€ΠΎΠ²Π΅Ρ€Π΅Π½Π½Ρ‹Ρ… ΠΏΡƒΡ‚Π΅ΠΉ Π² WMI-запрос. Если Π·Π»ΠΎΡƒΠΌΡ‹ΡˆΠ»Π΅Π½Π½ΠΈΠΊ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ EngineDirectory ΠΈΠ»ΠΈ EditorDirectory β€” Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ»ΡŒΠ½ΠΎΠ³ΠΎ WMI-запроса.

3. fixgithub.cs β€” 11,177 строк ASCII-Π°Ρ€Ρ‚Π°, 0 строк ΠΊΠΎΠ΄Π°

Π€Π°ΠΉΠ»: BusEngine/Code/fixgithub.cs β€” 1.7 MB.

Π€Π°ΠΉΠ» содСрТит 12+ ΠΊΠΎΠΏΠΈΠΉ ASCII-Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏΠ° Π² Π±Π»ΠΎΡ‡Π½Ρ‹Ρ… коммСнтариях ΠΈ Π½ΠΈ ΠΎΠ΄Π½ΠΎΠΉ строки ΠΊΠΎΠ΄Π°. Ни классов, Π½ΠΈ нСймспСйсов, Π½ΠΈ using. Π­Ρ‚ΠΎ ΠΌΡ‘Ρ€Ρ‚Π²Ρ‹ΠΉ Π³Ρ€ΡƒΠ·, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ:

  • ЗамСдляСт ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ (компилятор всё Ρ€Π°Π²Π½ΠΎ парсит ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ)
  • Π£Π²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ рСпозитория Π½Π° 1.7 MB
  • ЗасоряСт поиск ΠΏΠΎ ΠΊΠΎΠ΄Ρƒ

РСкомСндация: ΡƒΠ΄Π°Π»ΠΈΡ‚ΡŒ Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ.


πŸ”΄ HIGH β€” АрхитСктурныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹

4. God Object: BusEngine.cs β€” 10,105 строк, 50+ классов Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅

Один Ρ„Π°ΠΉΠ» содСрТит: Engine, AI, Audio, Browser, Camera, Canvas, Color, Core, FlowGraph, Layer, Level, Localization, Log, Material, Matrix2-4x3, Model, Object, Physics, Plugin, Rendering, Shader, Ajax, Json, File, Timer, Canvas (UI), Vector2-4, Video, ProjectDefault, Device, Form, IPlugin...

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

  • НСвозмоТно Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ (0 unit-тСстов)
  • Навигация ΠΏΠΎ Ρ„Π°ΠΉΠ»Ρƒ Π·Π°Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠΈΠ½ΡƒΡ‚Ρ‹ Π΄Π°ΠΆΠ΅ Π² IDE
  • Π›ΡŽΠ±ΠΎΠ΅ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ рискуСт ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ нСсвязанный Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½Π°Π»
  • ΠšΠΎΠ³Π½ΠΈΡ‚ΠΈΠ²Π½Π°Ρ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° Π½ΠΎΠ²Ρ‹Ρ… ΠΊΠΎΠ½Ρ‚Ρ€ΠΈΠ±ΡŒΡŽΡ‚ΠΎΡ€ΠΎΠ² Π·Π°ΠΏΡ€Π΅Π΄Π΅Π»ΡŒΠ½Π°
  • Класс-Π·Π°Π³Π»ΡƒΡˆΠΊΠ° internal class G (строка 6759) β€” нСвнятноС имя

5. МассовоС Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π°

Π€Π°ΠΉΠ» Π‘Ρ‚Ρ€ΠΎΠΊ Π˜Π΄Π΅Π½Ρ‚ΠΈΡ‡Π΅Π½
Game/Game.cs 278
Editor/Editor.cs 274 ✨ 99%

Π Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ:

  • GUID ΠΌΡŒΡŽΡ‚Π΅ΠΊΡΠ° (0968cb8e... vs 28cb03ec...)
  • Engine.Platform ("Windows" vs "WindowsEditor")

Π¨Π°Π±Π»ΠΎΠ½Ρ‹ (Launcher/Code/Plugin/Program.cs ΠΈ Plugin/Program.cs) Ρ‚Π°ΠΊΠΆΠ΅ содСрТат ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ‡Π½ΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ OnPostMessage.

Π˜ΡΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅: вынСсти ΠΎΠ±Ρ‰ΠΈΠΉ Initialize + Form Π² shared library.

6. Π—Π°ΡˆΠΈΡ‚Ρ‹Π΅ API-ΠΊΠ»ΡŽΡ‡ΠΈ

Π€Π°ΠΉΠ»: Plugin/Program.cs, строки 119-121

System.Environment.SetEnvironmentVariable("google_api_key", "123");
System.Environment.SetEnvironmentVariable("google_default_client_id", "123.apps.googleusercontent.com");
System.Environment.SetEnvironmentVariable("google_default_client_secret", "123-123");

Π₯отя значСния сСйчас Π·Π°Π³Π»ΡƒΡˆΠΊΠΈ, сам ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ опасСн. API-ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒΡΡ Π² ΠΊΠΎΠ΄Π΅.

7. ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ GC.Collect Π½Π° Ρ‚Π°ΠΉΠΌΠ΅Ρ€Π΅

Π€Π°ΠΉΠ»: BusEngine.cs, строки 3043-3045

System.GC.Collect();
System.GC.WaitForPendingFinalizers();
System.GC.Collect();  // ДВАЖДЫ подряд!

ΠšΠ°ΠΆΠ΄Ρ‹Π΅ N сСкунд (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ 5) вызываСтся ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ сборка мусора β€” Π΄Π²Π°ΠΆΠ΄Ρ‹. Π­Ρ‚ΠΎ симптом ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ ΠΏΠ°ΠΌΡΡ‚ΡŒΡŽ, Π° Π½Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅. Π’Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚ Ρ„Ρ€ΠΈΠ·Ρ‹ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°.


🟑 MEDIUM β€” ΠšΠ°Ρ‡Π΅ΡΡ‚Π²ΠΎ ΠΊΠΎΠ΄Π°

8. Π§Ρ€Π΅Π·ΠΌΠ΅Ρ€Π½ΠΎΠ΅ использованиС dynamic β€” 35 Π²Ρ…ΠΎΠΆΠ΄Π΅Π½ΠΈΠΉ

ВсС колбэки Ajax-класса ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°ΡŽΡ‚ dynamic:

public delegate void Success(dynamic data = null, dynamic xhr = null);
public delegate void Error(dynamic xhr = null, string textStatus = null, dynamic thrownError = null);

ВСряСтся Ρ‚ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ. Π˜ΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ Π²ΠΎ врСмя исполнСния вмСсто ошибок компиляции.

9. 512 ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΎΡ€ΠΎΠ² new β€” GC pressure

ΠœΠ½ΠΎΠΆΠ΅ΡΡ‚Π²ΠΎ Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠ°Π΄Ρ€ β€” Π²ΠΊΠ»ΡŽΡ‡Π°Ρ Paint-ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ. ΠŸΡ€ΠΈ 60 FPS = ~30,000 new/сСк β€” ΡΠ΅Ρ€ΡŒΡ‘Π·Π½Π°Ρ Π½Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π½Π° GC.

10. ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ многопоточности

  • 28 try / 14 catch β€” ΠΏΠΎΠ»ΠΎΠ²ΠΈΠ½Π° Π±Π»ΠΎΠΊΠΎΠ² try Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ (компилятор Π½Π΅ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ catch ΠΏΡ€ΠΈ finally, Π½ΠΎ здСсь ΠΈ finally ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ нСконсистСнтно)
  • БтатичСскиС ΠΌΡƒΡ‚Π°Π±Π΅Π»ΡŒΠ½Ρ‹Π΅ поля: Commands, FPSCPU, FPSGPU, FPSKEY β€” Π³ΠΎΠ½ΠΊΠΈ Π΄Π°Π½Π½Ρ‹Ρ…
  • Task.Factory.StartNew Π±Π΅Π· ConfigureAwait β€” deadlock-риск Π² UI-контСкстС
  • Π’Ρ€ΠΈ ΠΊΠΎΠΏΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½-Π»ΠΎΠ°Π΄Π΅Ρ€Π° (строки 5854-5953) β€” отличаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ typ (1/2/3), Π²Ρ‹Π±ΠΎΡ€ Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½ (typ = 3)

11. ΠΠ°Ρ€ΡƒΡˆΠ΅Π½ΠΈΠ΅ IDisposable β€” 43 Ρ€ΡƒΡ‡Π½Ρ‹Ρ… .Dispose()

ВмСсто using β€” Ρ€ΡƒΡ‡Π½Ρ‹Π΅ Π²Ρ‹Π·ΠΎΠ²Ρ‹ .Dispose(). ΠŸΡ€ΠΈ ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΈ рСсурсы ΡƒΡ‚Π΅ΠΊΠ°ΡŽΡ‚:

System.Threading.Tasks.Task[] tasks = ...;
// ... Ρ€Π°Π±ΠΎΡ‚Π° с tasks ...
foreach (System.Threading.Tasks.Task tt in tasks) {
    tt.Dispose();  // ΡƒΡ‚Π΅Ρ‡Ρ‘Ρ‚ Ссли ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π΄ΠΎ этого
}

12. Бтроковая конкатСнация Π² Ρ†ΠΈΠΊΠ»Π°Ρ… β€” 176 +=

ΠŸΠΎΡ€ΠΎΠΆΠ΄Π°Π΅Ρ‚ мноТСство ΠΏΡ€ΠΎΠΌΠ΅ΠΆΡƒΡ‚ΠΎΡ‡Π½Ρ‹Ρ… строк. НуТСн StringBuilder.

13. ΠžΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ€Π΅Π»ΠΈΠ·Π΅ β€” 124 Π²Ρ‹Π·ΠΎΠ²Π° Console.*

Console.WriteLine, Console.Beep() β€” Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ΄ #if DEBUG.

14. Environment.Exit(0) Π² Shutdown

public static void ShutdownStatic(bool nagibator = false) {
    // ...
    if (nagibator) {
        System.Environment.Exit(0);  // ТёсткоС убийство процСсса
    }
}

ΠŸΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ с ΠΈΠ³Ρ€ΠΈΠ²Ρ‹ΠΌ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ nagibator. Environment.Exit Π½Π΅ Π΄Π°Ρ‘Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒΡΡ Ρ„ΠΈΠ½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Π°ΠΌ ΠΈ finally-Π±Π»ΠΎΠΊΠ°ΠΌ.

15. Unsafe P/Invoke Π±Π΅Π· ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ ошибок

[DllImport("ntdll.dll", SetLastError = true)]
private static extern bool NtSetTimerResolution(...);

ВызываСтся Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Marshal.GetLastWin32Error(). ΠŸΡ€ΠΈ ошибкС Ρ‚Π°ΠΉΠΌΠ΅Ρ€ ΠΌΠΎΠΆΠ΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ Π½Π΅Π²Π΅Ρ€Π½ΠΎ Π±Π΅Π· диагностики.


🟒 LOW β€” Π‘Ρ‚ΠΈΠ»ΡŒ ΠΈ докумСнтация

ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π”Π΅Ρ‚Π°Π»ΠΈ
Π—Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ~30% ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹ β€” ΠΌΡ‘Ρ€Ρ‚Π²Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² коммСнтариях
БСлорусскиС ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠžΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½Ρ‹ΠΉ Π²ΠΊΠ»Π°Π΄
0 тСстов ΠŸΡ€ΠΈ 23K строк ΠΊΠΎΠ΄Π° β€” любой Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³ рискован
НСт README ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΠ΅Ρ‚ описаниС, инструкции ΠΏΠΎ сборкС
internal class G Π—Π°Π³Π»ΡƒΡˆΠΊΠ° с бСссмыслСнным ΠΈΠΌΠ΅Π½Π΅ΠΌ
Π˜Π³Ρ€ΠΎΠ²Ρ‹Π΅ названия nagibator, Π¨Π΅Π΄Π΅Π²Ρ€.busproject Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π°Ρ…
CefSharp Π·Π°Π²ΠΈΡΠΈΠΌΠΎΡΡ‚ΡŒ ~100MB+ Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊΠΎΠ² Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ

πŸ“Š Бводная Ρ‚Π°Π±Π»ΠΈΡ†Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊ

ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ° Π—Π½Π°Ρ‡Π΅Π½ΠΈΠ΅
Π‘Ρ‚Ρ€ΠΎΠΊ C# ΠΊΠΎΠ΄Π° ~23,000
Π‘Ρ‚Ρ€ΠΎΠΊ Π² fixgithub.cs (мусор) 11,177
Классов Π² ΠΎΠ΄Π½ΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅ 50+
new Π°Π»Π»ΠΎΠΊΠ°Ρ†ΠΈΠΉ 512
dynamic использований 35
try Π±Π΅Π· catch 14
IDisposable Π±Π΅Π· using 43
Console.* Π² ΠΊΠΎΠ΄Π΅ 124
Task.Factory.StartNew 12
GC.Collect() ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ 2Γ— ΠΊΠ°ΠΆΠ΄Ρ‹Π΅ 5 сСк
RCE-уязвимостСй 1 (ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π΅Π½ΠΎ)
WMI-ΠΈΠ½ΡŠΠ΅ΠΊΡ†ΠΈΠΉ 1
Unit-тСстов 0

πŸ”§ ΠŸΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½ исправлСний

ΠšΡ€ΠΈΡ‚ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ (Π½Π΅ΠΌΠ΅Π΄Π»Π΅Π½Π½ΠΎ)

  1. ❌ Π£Π΄Π°Π»ΠΈΡ‚ΡŒ fixgithub.cs β€” 1.7MB мусора
  2. ❌ RCE Fix β€” whitelist URL Π² Process.Start ΠΈΠ»ΠΈ ΠΏΠΎΠ»Π½Ρ‹ΠΉ Π·Π°ΠΏΡ€Π΅Ρ‚ запуска процСссов ΠΈΠ· Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π°
  3. ❌ WMI Injection Fix β€” ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ запросы ΠΈΠ»ΠΈ санитизация ΠΏΡƒΡ‚Π΅ΠΉ

Высокий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

  1. ВынСсти ΠΎΠ±Ρ‰ΠΈΠΉ ΠΊΠΎΠ΄ Game/Editor Π² Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ класс
  2. Π£Π±Ρ€Π°Ρ‚ΡŒ GC.Collect() β€” Π½Π°ΠΉΡ‚ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· memory profiler
  3. Π£Π±Ρ€Π°Ρ‚ΡŒ Environment.Exit() β€” Π·Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Π½Π° Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ shutdown
  4. ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΡ‚ΠΈ API-ΠΊΠ»ΡŽΡ‡ΠΈ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³-Ρ„Π°ΠΉΠ» (с .gitignore)

Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

  1. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ dynamic Π½Π° строго Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ DTO Π² Ajax-колбэках
  2. Π Π°Π·Π±ΠΈΡ‚ΡŒ BusEngine.cs β€” ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ классу Π½Π° Ρ„Π°ΠΉΠ»
  3. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ тСсты β€” ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌ Π½Π° Vector/Math/Matrix
  4. Π—Π°ΠΌΠ΅Π½ΠΈΡ‚ΡŒ Ρ€ΡƒΡ‡Π½Ρ‹Π΅ .Dispose() Π½Π° using
  5. Π‘Ρ‚Ρ€ΠΎΠΊΠΎΠ²Ρ‹Π΅ Π±ΠΈΠ»Π΄Π΅Ρ€Ρ‹ вмСсто ΠΊΠΎΠ½ΠΊΠ°Ρ‚Π΅Π½Π°Ρ†ΠΈΠΈ Π² Ρ†ΠΈΠΊΠ»Π°Ρ…
  6. Π£Π±Ρ€Π°Ρ‚ΡŒ Console.* ΠΏΠΎΠ΄ #if DEBUG
  7. Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ConfigureAwait(false) Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄

Низкий ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

  1. README с инструкциями ΠΏΠΎ сборкС
  2. ΠŸΠΎΡ‡ΠΈΡΡ‚ΠΈΡ‚ΡŒ Π·Π°ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄
  3. АнглийскиС ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ для ΠΌΠ΅ΠΆΠ΄ΡƒΠ½Π°Ρ€ΠΎΠ΄Π½ΠΎΠ³ΠΎ сообщСства

ΠžΠ±Ρ‰Π°Ρ ΠΎΡ†Π΅Π½ΠΊΠ°

Π­Ρ‚ΠΎ ΡΠΎΠ»ΡŒΠ½Ρ‹ΠΉ indie-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π°ΠΌΠ±ΠΈΡ†ΠΈΠΎΠ·Π½Ρ‹ΠΌ Ρ€Π°Π·ΠΌΠ°Ρ…ΠΎΠΌ β€” 3D-Π΄Π²ΠΈΠΆΠΎΠΊ, Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€, Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€, плагинная систСма, ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° Android. Автор дСмонстрируСт Π³Π»ΡƒΠ±ΠΎΠΊΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅ C#, WinAPI, рСфлСксии ΠΈ многопоточности. Однако ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ страдаСт ΠΎΡ‚ классичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ solo-Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ: God Object, отсутствиС тСстов, Π·Π°ΡˆΠΈΡ‚Ρ‹Π΅ сСкрСты, ΠΎΡ‚Π»Π°Π΄ΠΎΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ Π² Ρ€Π΅Π»ΠΈΠ·Π΅.

ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ НЕ Π³ΠΎΡ‚ΠΎΠ² ΠΊ production-использованию Π±Π΅Π· исправлСния RCE-уязвимости ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π½ΠΎΠ³ΠΎ Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π°. ПослС устранСния критичСских ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» высокий β€” Π΄Π²ΠΈΠΆΠΎΠΊ ΡƒΠΆΠ΅ содСрТит Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³, Ρ„ΠΈΠ·ΠΈΠΊΡƒ, Π·Π²ΡƒΠΊ (LibVLC), Π²ΠΈΠ΄Π΅ΠΎ, UI (WinForms), Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ (CefSharp), ΡΠ΅Ρ‚ΡŒ (Ajax/HttpClient), ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹.

Review Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ Π°Π³Π΅Π½Ρ‚ΠΎΠΌ Hermes Agent. 12.07.2026.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions