"Sandbox dla PowerShell'a - zrób to sam!" - Dawid PachowskiPROIDEA
W świecie malware'ów i dropper'ów umiejętność deobfuskacji skryptów PowerShell'a jest istotnym elementem analizy, pozwalającym na dokładne zgłębienie działania często skomplikowanych skryptów. Zaprezentuję dotychczas znane metody deobfuskacji tych skryptów oraz zaproponuję nową, która prowadzi nawet do zbudowania własnego, automatycznego sandbox'a.
Jak migrować kod legacy do Symfony? Tips & tricksXSolve
Masz do czynienia z legacy kodem i zastanawiasz się jak zacząć go przepisywać do Symfony? W tej prezentacji postaramy się podpowiedzieć, jak zacząć migrować kod starej aplikacji bez przerywania jej działania i konieczności przepisywania całości za jednym razem.
"Sandbox dla PowerShell'a - zrób to sam!" - Dawid PachowskiPROIDEA
W świecie malware'ów i dropper'ów umiejętność deobfuskacji skryptów PowerShell'a jest istotnym elementem analizy, pozwalającym na dokładne zgłębienie działania często skomplikowanych skryptów. Zaprezentuję dotychczas znane metody deobfuskacji tych skryptów oraz zaproponuję nową, która prowadzi nawet do zbudowania własnego, automatycznego sandbox'a.
Jak migrować kod legacy do Symfony? Tips & tricksXSolve
Masz do czynienia z legacy kodem i zastanawiasz się jak zacząć go przepisywać do Symfony? W tej prezentacji postaramy się podpowiedzieć, jak zacząć migrować kod starej aplikacji bez przerywania jej działania i konieczności przepisywania całości za jednym razem.
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
Prezentacja na phpCE Polska 2017. Omawiam historię PHP oraz sposób, w jaki wykorzystujemy go dzisiaj. Pokazuję, w jaki sposób wybierać narzędzia i architekturę, aby nasze projekty żyły na produkcji długo i szczęśliwie.
Castle Game Engine presentation at Zlot Programistów Delphi 2023 (Polish)Michalis Kamburelis
Presentation of Castle Game Engine ( https://castle-engine.io/ ) at Zlot Programistów Delphi 2023 (Polish Delphi conference).
Castle Game Engine is a 3D and 3D open-source game engine. In this talk, Michalis Kamburelis presents engine features (powerful editor and modern Pascal API) and discusses future plans.
Jeśli pierwsze kroki w systemie Windows XP masz za sobą, a chcesz jeszcze sprawniej go obsługiwać, trzymasz w ręku właściwą książkę. Za pomocą praktycznych ćwiczeń odkryje ona przed Tobą wiele tajemnic Windows XP, które pozwolą Ci w jeszcze większym stopniu wykorzystać jego bogate możliwości. Obok ćwiczeń opisujących jak "przekonać" system Windows XP, aby pracował tak jak sobie tego życzymy, znajdują się w niej opisy darmowych programów rozszerzających funkcjonalność tego środowiska lub pomagających diagnozować i rozwiązywać konkretne problemy.
Opisano między innymi:
* Różne sposoby instalacji Windows XP, w tym instalację sieciową
* Rejestr systemu
* Środowisko użytkownika: automatyczne logowanie, przyspieszanie restartu, tworzenie ikonek i wiele innych przydatnych tricków
* Pracę Windows XP w sieci
* Administrację systemem
* Rozmaite sposoby zabezpieczania Windows XP
* Optymalne wykorzystanie twardych dysków,
* Rozwiązania najczęściej pojawiających się problemów z Windows XP
Skazani na firmware. Serwer na ARM64? Tak, to możliwe! S07E03Semihalf
Przedstawiamy firmware UEFI, dzięki któremu możliwe jest coraz śmielsze wkraczanie architektury ARM64 do świata urządzeń serwerowych, czyli królestwa władanego przez Intel. Standardy, ich założenia i realizacja zostałą przybliżona na przykładzie dodawania wsparcia dla n
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMArtur Skowroński
Myślisz, że znalezienie trufli jest trudne? Spróbuj zrozumieć Truffle w GraalVM!
W tej lekkostrawnej prezentacji zamierzam uprościć to, co skomplikowane, i wyjaśnić rolę Truffle w ekosystemie GraalVM. Kontynuując kulinarną analogię, wyobraź sobie Truffle jako tajemniczy składnik, który wyciąga prawdziwy aromat GraalVM – wspiera wiele języków i zwiększa wydajność, tak jak prawdziwe trufle dodają daniu smak.
Przebijemy się przez techniczny żargon i wyjaśnimy, co naprawdę oznacza "framework implementacji języka". Dowiesz się, jak działa Truffle, dlaczego jest ważne, a nawet spróbujemy napisać jakiś kawałek prostego języka – zgodnie z zasadą "słowa są tanie, pokaż mi kod"
How to run system administrator recruitment process? By creating platform based on open source parts in just 2 nights! I gave this talk in Poland / Kraków OWASP chapter meeting on 17th Octomber 2013 at our local Google for Entrepreneurs site. It's focused on security and also shows how to create recruitment process in CTF / challenge way.
This story covers mostly security details of this whole platform. There's great chance, that I will give another talk about this system but this time focusing on technical details. Stay tuned ;)
CodiLime Tech Talk - Dawid Trzebiatowski i Wojciech Urbański: Opening the Flo...CodiLime
Tech Talk CodiLime 22.04.2020.
YT: https://youtu.be/66S5LFM12JQ
In this talk, we’re going to introduce the general public to our approach to simplified Spinnaker management using Floodgate, our open-source tool as well as Spinnaker-provided components, such as Sponnet.
Jak zacząć, aby nie żałować - czyli 50 twarzy PHPPiotr Horzycki
Prezentacja na phpCE Polska 2017. Omawiam historię PHP oraz sposób, w jaki wykorzystujemy go dzisiaj. Pokazuję, w jaki sposób wybierać narzędzia i architekturę, aby nasze projekty żyły na produkcji długo i szczęśliwie.
Castle Game Engine presentation at Zlot Programistów Delphi 2023 (Polish)Michalis Kamburelis
Presentation of Castle Game Engine ( https://castle-engine.io/ ) at Zlot Programistów Delphi 2023 (Polish Delphi conference).
Castle Game Engine is a 3D and 3D open-source game engine. In this talk, Michalis Kamburelis presents engine features (powerful editor and modern Pascal API) and discusses future plans.
Jeśli pierwsze kroki w systemie Windows XP masz za sobą, a chcesz jeszcze sprawniej go obsługiwać, trzymasz w ręku właściwą książkę. Za pomocą praktycznych ćwiczeń odkryje ona przed Tobą wiele tajemnic Windows XP, które pozwolą Ci w jeszcze większym stopniu wykorzystać jego bogate możliwości. Obok ćwiczeń opisujących jak "przekonać" system Windows XP, aby pracował tak jak sobie tego życzymy, znajdują się w niej opisy darmowych programów rozszerzających funkcjonalność tego środowiska lub pomagających diagnozować i rozwiązywać konkretne problemy.
Opisano między innymi:
* Różne sposoby instalacji Windows XP, w tym instalację sieciową
* Rejestr systemu
* Środowisko użytkownika: automatyczne logowanie, przyspieszanie restartu, tworzenie ikonek i wiele innych przydatnych tricków
* Pracę Windows XP w sieci
* Administrację systemem
* Rozmaite sposoby zabezpieczania Windows XP
* Optymalne wykorzystanie twardych dysków,
* Rozwiązania najczęściej pojawiających się problemów z Windows XP
Skazani na firmware. Serwer na ARM64? Tak, to możliwe! S07E03Semihalf
Przedstawiamy firmware UEFI, dzięki któremu możliwe jest coraz śmielsze wkraczanie architektury ARM64 do świata urządzeń serwerowych, czyli królestwa władanego przez Intel. Standardy, ich założenia i realizacja zostałą przybliżona na przykładzie dodawania wsparcia dla n
Kopiąc Trufle - Odkrywanie tajemnic najmniej zrozumiałego elementu GraalVMArtur Skowroński
Myślisz, że znalezienie trufli jest trudne? Spróbuj zrozumieć Truffle w GraalVM!
W tej lekkostrawnej prezentacji zamierzam uprościć to, co skomplikowane, i wyjaśnić rolę Truffle w ekosystemie GraalVM. Kontynuując kulinarną analogię, wyobraź sobie Truffle jako tajemniczy składnik, który wyciąga prawdziwy aromat GraalVM – wspiera wiele języków i zwiększa wydajność, tak jak prawdziwe trufle dodają daniu smak.
Przebijemy się przez techniczny żargon i wyjaśnimy, co naprawdę oznacza "framework implementacji języka". Dowiesz się, jak działa Truffle, dlaczego jest ważne, a nawet spróbujemy napisać jakiś kawałek prostego języka – zgodnie z zasadą "słowa są tanie, pokaż mi kod"
How to run system administrator recruitment process? By creating platform based on open source parts in just 2 nights! I gave this talk in Poland / Kraków OWASP chapter meeting on 17th Octomber 2013 at our local Google for Entrepreneurs site. It's focused on security and also shows how to create recruitment process in CTF / challenge way.
This story covers mostly security details of this whole platform. There's great chance, that I will give another talk about this system but this time focusing on technical details. Stay tuned ;)
CodiLime Tech Talk - Dawid Trzebiatowski i Wojciech Urbański: Opening the Flo...CodiLime
Tech Talk CodiLime 22.04.2020.
YT: https://youtu.be/66S5LFM12JQ
In this talk, we’re going to introduce the general public to our approach to simplified Spinnaker management using Floodgate, our open-source tool as well as Spinnaker-provided components, such as Sponnet.
CodiLime Tech Talk - Grzegorz Rozdzialik: What the java scriptCodiLime
The document discusses various JavaScript quirks, including:
- Numbers have limited precision for non-power-of-2 fractions due to IEEE 754 representation. This can cause issues like 0.1 + 0.2 not equalling 0.3.
- Regular expressions have state stored in the lastIndex property, and the global flag g must be used carefully between matches.
- Variable declarations differ between var, let, and const. var has function scope and hoisting, while let and const have block scope without hoisting.
- Operators like void and || can be useful in certain cases like preventing function returns or providing default parameter values.
CodiLime Tech Talk - Katarzyna Ziomek-Zdanowicz: RxJS main concepts and real ...CodiLime
The document discusses RxJS, a library for reactive programming using observable streams. It introduces key RxJS concepts like Observables, operators, and the pipe method. It then provides a real-world example of an interactive drawing application using RxJS to manage streams of user input events, application state, and drawing output. Operators like switchMap are used to flatten streams and handle interactions. Flattening strategies of different operators are also explained. The summary concludes by emphasizing benefits of RxJS like managing complex async processes and broadening programming perspectives.
CodiLime Tech Talk - Wojciech Urbański: Cloud NativeCodiLime
The document discusses the 12 Factor App methodology for building cloud-native applications. It provides three stories that show how the 12 factors can be applied: 1) Containerizing a legacy application to make it cloud-native, 2) Using serverless computing and how the 12 factors still apply, and 3) Open sourcing a SaaS product using the GitLab model. In each story, the 12 factors are listed and it's explained how they relate to the cloud-native approaches and best practices discussed. The document concludes that the 12 factors provide good guidance but should not limit developers' creativity in building cloud applications.
CodiLime Tech Talk - Michał Sochoń: Configuration management hellCodiLime
This document discusses the challenges of configuration management for distributed systems. It describes how configuration can become complex due to different paradigms (imperative vs declarative), parameters, provisioning ways, and setups. An example of configuring an ETCD cluster on GCP is provided. Key limitations are dealing with changing configurations and data migration during changes. The document advocates separating initial provisioning from instance-level configuration and using scripts tailored to instances' states to help address these challenges.
CodiLime Tech Talk - Adam Kułagowski: IPv6 - introductionCodiLime
IPv6 was created to address the limited address space of IPv4 as global IPv4 address allocation was running out. Some of the key differences between IPv4 and IPv6 include IPv6's significantly larger 128-bit address space compared to IPv4's 32-bit addresses, as well as changes to areas like packet headers, fragmentation, and neighbor discovery. Transition technologies like dual stack, NAT64, and DS-Lite were developed to help transition from IPv4 to IPv6, while ensuring IPv6 connectivity even for networks and devices that still use IPv4. Fully enabling IPv6 requires changes to network infrastructure like firewalls, routers, and switches to support the new protocol.
Tech Talk - Konrad Gawda : P4 programming languageCodiLime
The document discusses P4, a programming language for protocol-independent packet processors. P4 allows programmers to write programs that specify the packet forwarding behavior of network switches and routers. It introduces P4 concepts like tables for matching and actions, target architectures, and examples of what can be programmed with P4 like load balancers and network telemetry. P4 aims to provide programming possibilities, performance, and simplicity for network hardware.
CodiLime Tech Talk - Michał Pawluk: Our production deployment in AWS (HashiCo...CodiLime
For someone who does not usually work with AWS, deploying a service may often be akin to starting up a virtual machine and exposing it to the world. This might be a good educated guess in other contexts, but it's not adjusted to the AWS workflow, and sometimes may even be harmful.
During our tech talk, we described a deployment of a production service in AWS and the best practices that we utilized, based on our experience with the HashiCorp Vault deployment. We talked about solutions provided by AWS which we utilized in our deployment. We also talked about our experiences with automation and maintaining infrastructure as code, as well as our impression of the tools we used for these purposes.
CodiLime Tech Talk - Michał Pawluk: Our deployment of HashiCorp VaultCodiLime
This document discusses HashiCorp Vault, an open source tool for securely accessing secrets. It provides an overview of how Vault was deployed across multiple Availability Zones on AWS, including the infrastructure setup and access configurations. Automation with Terraform and Packer is also covered. The document concludes with discussing improvements that could be made and taking any questions.
CodiLime Tech Talk - Maciej Sawicki: Streamline application deployments with ...CodiLime
Tech Talk CodiLime 31.01.2018 DevOps by Example
CodiLime Tech Talk - Maciej Sawicki: Streamline application deployments with Kubernetes and Helm
You can find the recording here: https://youtu.be/6hazvmPOWHY
CodiLime Tech Talk - Jarek Łukow: You need a cloud to test a cloud: using Ope...CodiLime
Tech Talk CodiLime 31.01.2018 DevOps by Example
Jarek Łukow: You need a cloud to test a cloud: using OpenStack's CI framework for developing an SDN platform
You can find the recording here: https://youtu.be/T4fswB0hDY4
CodiLime Tech Talk - Jarek Łukow: You need a cloud to test a cloud: using Ope...
CodiLime Tech Talk - Michał Cłapiński, Mateusz Jabłoński: Debugging faultily inherited file handles on Microsoft Windows.
1. Tonący Python 2 pliku się chwyta,
czyli jak debugowaliśmy wyciekające uchwyty pod Windowsem.
Michał Cłapiński, Mateusz Jabłoński
23.05.2018
2. Czym się zajmujemy?
● Michał Cłapiński
○ michal.clapinski@codilime.com
● Mateusz Jabłoński
○ mateusz.jablonski@codilime.com
● Pracujemy w CodiLime
● Portujemy Tungsten Fabric (dawniej OpenContrail) na Windowsa
● Przygotowujemy system continuous integration w celu testowania naszego kodu
3. Krótko o Tungsten Fabric
● Multicloud multistack SDN
● SDN = Software-defined networking
● Projekt Linux Foundation
● Budowany za pomocą SConsów
4. Napotkany problem
● Włączyliśmy budowanie wielowątkowe w naszym CI
○ Znaczne przyśpieszenie budowania (20 minut / 2 godziny)
○ Zysk w CI i na maszynach programistów
5. Napotkany problem
● Włączyliśmy budowanie wielowątkowe w naszym CI
○ Znaczne przyśpieszenie budowania (20 minut / 2 godziny)
○ Zysk w CI i na maszynach programistów
● Zaczęły pojawiać się nieprzewidywalne błędy
○ ~5% buildów zakończonych niepowodzeniem
○ Błędy na różnym etapie budowania
○ Jeżeli jeden build kompiluje 1000 plików to błąd występował raz na 20000 plików
○ Za każdym razem błąd dotyczył pliku tworzonego przez Pythona
6. Napotkany problem - przykład
css_DT_bootstrap_css.cpp(4): error C2065: 'DT_bootstrap_css': undeclared identifier
css_DT_bootstrap_css.cpp(4): error C2065: 'DT_bootstrap_css_len': undeclared identifier
scons: *** [sandesh_http.obj] Error 2
scons: building terminated because of errors.
● Plik css_DT_bootstrap_css.cpp jest jest generowany przez SConscript i później
kompilowany
● Plik został źle wygenerowany?
7. Napotkany problem - przykład
Kod generujący plik css_DT_bootstrap_css.cpp:
1. with open(cname, 'w') as cfile:
2. cfile.write('namespace {n')
3.
4. subprocess.call('xxd -i ' + hname + ' >> ' + os.path.basename(cname), shell=True, cwd=opath)
5.
6. with open(cname, 'a') as cfile:
7. cfile.write('}n')
8. cfile.write(tail_content)
● Brakujący kod jest generowany w linii 4
● Dodanie sprawdzania rezultatu subprocess.call pozwala wychwycić błąd wcześniej
● Nadal nie wiemy jaka jest przyczyna
8. Napotkany problem - przykład
c1xx: fatal error C1083: Cannot open source file: 'multicast_html.cpp': No such file or directory
scons: *** [multicast_html.obj] Error 2
● multicast_html.cpp jest generowany podobnie do css_DT_bootstrap_css.cpp
● Dlaczego dostajemy błąd ‘No such file or directory’?
● Plik istnieje. Czy został stworzony po próbie jego kompilacji?
10. Podejście pierwsze: ProcMon
● Process Monitor: narzędzie do monitorowania aktywności systemu plików, rejestru i wątków
● Umożliwia filtrowanie na podstawie różnych kryteriów
○ Nazwa procesu, PID, ścieżka do używanego pliku, wynik i inne
● Chcemy zobaczyć jakie procesy używały jakich plików i kiedy miało to miejsce
● Wielkość logów uniemożliwia budowanie do czasu napotkania błędu z raz włączonym ProcMonem
● Rzadko spotykany błąd, więc ręczny restart ProcMona i budowania trwałby wiele godzin
11. Podejście pierwsze: ProcMon
Automatyzacja za pomocą skryptu PowerShell:
$ErrorActionPreference = "SilentlyContinue"
Do {
[remove build artifacts]
.internalsprocmon /Quiet /BackingFile proclogslog.pml
.internalsprocmon /WaitForIdle
scons -j 8 contrail-vrouter-agent
$code = $LastExitCode
.internalsprocmon /Terminate
While (Get-Process procmon) {
Start-Sleep 1
}
} While ($code -eq 0)
13. Podejście pierwsze: ProcMon
● cmd.exe otwiera plik, do którego pisze xxd z powodu użycia przekierowania powłoki (‘>>’)
● Python otworzył plik 3 razy, zamknął 2 razy
● cl.exe próbuje otworzyć plik, do którego uchwyt jest nadal używany przez Pythona
● ‘No such file or directory’, które widzieliśmy w logach to w rzeczywistości SHARING VIOLATION
● Brakujące CloseFile jest wywoływane przez cmd.exe?
14. Krótko o trybach współdzielenia
HANDLE WINAPI CreateFile(..., _In_ DWORD dwDesiredAccess, _In_ DWORD dwShareMode, ...);
● dwDesiredAccess:
○ GENERIC_READ, GENERIC_WRITE, GENERIC_READ | GENERIC_WRITE (i inne)
● dwShareMode:
○ 0, FILE_SHARE_DELETE, FILE_SHARE_READ, FILE_SHARE_WRITE i kombinacje
● ERROR_SHARING_VIOLATION w przypadku niekompatybilnych trybów
● dwShareMode musi brać pod uwagę wcześniejsze wywołanie CreateFile
16. Krótko o trybach współdzielenia
● Python otworzył plik z GENERIC_WRITE | READ_CONTROL
● cl.exe próbuje otworzyć go z FILE_SHARE_READ
● Wywołanie kończy się niepowodzeniem (ERROR_SHARING_VIOLATION)
● Wniosek: Uchwyt na plik nie został zamknięty
17. Podejście drugie: Frida
● Potrzebowaliśmy potężniejszego, skryptowalnego sposobu monitorowania
● Frida: narzędzie do dynamicznej instrumentacji
● Pozwala wstrzykiwać własny kod do dowolnych procesów
○ Wstrzykuje silnik JavaScriptu V8, pozwala uruchamiać własny kod JS
● Umożliwia przechwytywanie wywołań dowolnych funkcji
○ Logowanie wywołań
○ Modyfikacja argumentów
○ Modyfikacja wartości zwracanej
19. Podejście drugie: Frida
var getPathAAddress = Module.findExportByName(null, "GetFinalPathNameByHandleA")
var getPathA = new NativeFunction(getPathAAddress, 'uint32', ['pointer', 'pointer', 'uint32', 'uint32'])
[...]
var handlePath = Memory.alloc(2001)
getPathA(handle, handlePath, 2000, 0)
send("CreateFile " + String(handle.toInt32()) + " " + String(Memory.readUtf8String(handlePath)))
20. Podejście drugie: Frida
● Wstrzyknęliśmy kod JS do procesu Pythona. Monitorowaliśmy CreateFile i CloseHandle
CreateFile 14468 16:2:46.429 1704 [...]multicast_html.cpp
[...]
CloseHandle 14468 16:2:46.432 1704 [...]multicast_html.cpp
CloseHandle: 1
● Python w każdym przypadku wywoływał poprawnie CloseHandle
● Dlaczego cmd.exe zamyka plik, którego nie otwiera?
● Dlaczego ProcMon nie pokazuje wywołania CloseHandle?
22. Podejście drugie: Frida
auto f = _open("costam.txt", 0);
char *argv[] = { "cmd.exe", "/c", "pwd && ping 127.0.0.1 -n 5", NULL };
_spawnve(_P_NOWAIT, "C:WindowsSystem32cmd.exe", argv, NULL);
_close(f);
● ProcMon pokazuje jedynie CloseHandle na ostatnim egzemplarzu danego uchwytu (zniszczenie
obiektu w kernelu)
● Wniosek: procesy potomne Pythona niekiedy dziedziczą uchwyty do plików otwieranych przez Pythona
23. Reprodukcja problemu
Kolejny krok: analiza wywołań CreateFile i CreateProcess:
● Otwarcie pliku i stworzenie procesu cmd.exe nastąpiło praktycznie w tym samym momencie
● Działo się tak za każdym razem, gdy wyciekał uchwyt
● Wyścig w implementacji CPythona? Wyścig w API Windowsa?
24. Reprodukcja problemu
● SCons do uruchamiania procesu kompilatora używa os.spawnve
● os.spawnve jest zaimplementowane przy użyciu _spawnve z Windows API
● _spawnve jest funkcją Microsoft Windows, inspirowaną funkcjami fork i exec
25. Reprodukcja problemu
● SCons do uruchamiania procesu kompilatora używa os.spawnve
● os.spawnve jest zaimplementowane przy użyciu _spawnve z Windows API
● _spawnve jest funkcją Microsoft Windows, inspirowaną funkcjami fork i exec
● Problem z implementacją _spawnve?
● Napisaliśmy fragment kodu odtwarzającego problem
○ Nieskończone otwieranie i zamykanie pliku w jednym wątku
○ Nieskończone uruchamianie cmd.exe w drugim wątku
26. Reprodukcja problemu
import os
from time import sleep
from threading import Thread
def threaded_function1():
while True:
with open("sample.txt", "w"):
pass
def threaded_function2():
while True:
os.spawnve(os.P_WAIT, 'C:Windowssystem32cmd.exe', ['cmd.exe', '/c'], os.environ)
thread1 = Thread(target = threaded_function1)
thread2 = Thread(target = threaded_function2)
thread1.start()
thread2.start()
27. Reprodukcja problemu
● ProcMon pokazał dziedziczenie wielu uchwytów do ‘sample.txt’ przez cmd.exe
● Nadal nie wiemy, czy jest to problem z implementacją CPythona czy ze _spawnve
28. Reprodukcja problemu
● ProcMon pokazał dziedziczenie wielu uchwytów do ‘sample.txt’ przez cmd.exe
● Nadal nie wiemy, czy jest to problem z implementacją CPythona czy ze _spawnve
● Szybka weryfikacja: Przepisaliśmy wywołanie os.spawnve na subprocess.call
○ subprocess.call używa funkcji CreateProcess
29. Reprodukcja problemu
● ProcMon pokazał dziedziczenie wielu uchwytów do ‘sample.txt’ przez cmd.exe
● Nadal nie wiemy, czy jest to problem z implementacją CPythona czy ze _spawnve
● Szybka weryfikacja: Przepisaliśmy wywołanie os.spawnve na subprocess.call
○ subprocess.call używa funkcji CreateProcess
● Błąd nadal występował
● Wniosek: Prawdopodobnie problem z implementacją CPythona
30. Rozwiązanie
● Uruchomiliśmy przykład weryfikacyjny przy użyciu aktualnej wersji Pythona 3
● Problem zniknął (zarówno dla subprocess.call jak i _spawnve)
● Zdecydowaliśmy się przepisać wszystkie skrypty budujące na Pythona 3
● Od tej pory problem nie występuje - budujemy kod w CI wielowątkowo
● Rozwiązaliśmy problem wyłącznie w naszym CI. Nadal nie znamy jego przyczyny
31. Rozwiązanie
● Użyliśmy wyszukiwania binarnego
● Instalowaliśmy oficjalne wydania
● Błąd nie występuje w wersji >=3.4
● Kompilowaliśmy pojedyncze commity
● Wymagane były starsze wersje Visual Studio…
32. Rozwiązanie
● Użyliśmy wyszukiwania binarnego
● Instalowaliśmy oficjalne wydania
● Błąd nie występuje w wersji >=3.4
● Kompilowaliśmy pojedyncze commity
● Wymagane były starsze wersje Visual Studio…
● ...które wymagają starszych wersji Windowsa
33. Rozwiązanie
Fragment kodu rozwiązujący problem (źródło):
#ifdef MS_WINDOWS
flags |= O_NOINHERIT;
#elif defined(O_CLOEXEC)
flags |= O_CLOEXEC;
#endif
...
self->fd = open(name, flags, 0666);
34. Rozwiązanie
Issue #18571: Implementation of the PEP 446: file descriptors and file handles
“This PEP proposes to make all file descriptors created by Python non-inheritable by default to reduce
the risk of these issues. This PEP fixes also a race condition in multi-threaded applications on operating
systems supporting atomic flags to create non-inheritable file descriptors.”
Źródło: PEP 446
36. Wnioski
● Omijajcie Pythona 2 (w szczególności na Windowsie)
● Uważajcie na przypadkowe dziedziczenie (szczególnie w API POSIXowym)
● ProcMon loguje zamknięcie tylko ostatniego egzemplarza danego uchwytu