abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 20:11 | Nová verze

    Bylo vydáno Ubuntu 24.04.4 LTS, tj. čtvrté opravné vydání Ubuntu 24.04 LTS s kódovým názvem Noble Numbat. Přehled novinek a oprav na Discourse.

    Ladislav Hagara | Komentářů: 0
    dnes 17:44 | Pozvánky

    V pátek 20. února 2025 se v pražské kanceláři SUSE v Karlíně uskuteční 6. Mobile Linux Hackday, komunitní setkání zaměřené na Linux na mobilních zařízeních, kernelový vývoj a uživatelský prostor. Akce proběhne od 10:00 do večera. Hackday je určen všem, kteří si chtějí prakticky vyzkoušet práci s linuxovým jádrem i uživatelským prostorem, od posílání patchů například pomocí nástroje b4, přes balíčkování a Flatpak až po drobné úpravy

    … více »
    lkocman | Komentářů: 0
    dnes 13:33 | IT novinky

    Evropská rada vydavatelů (EPC) předložila Evropské komisi stížnost na americkou internetovou společnost Google kvůli její službě AI Overviews (AI souhrny), která při vyhledávání na internetu zobrazuje shrnutí informací ze zpravodajských serverů vytvořená pomocí umělé inteligence (AI). Evropská komise již v prosinci oznámila, že v souvislosti s touto službou začala firmu Google vyšetřovat. Google obvinění ze strany vydavatelů

    … více »
    Ladislav Hagara | Komentářů: 10
    dnes 04:44 | Komunita

    Ubuntu 26.04 (Resolute Raccoon) už nebude v desktopové instalaci obsahovat GUI nástroj 'Software & Updates'. Důvodem jsou obavy z jeho složitosti pro běžné uživatele a z toho plynoucích bezpečnostních rizik. Nástroj lze doinstalovat ručně (sudo apt install software-properties-gtk).

    NUKE GAZA! 🎆 | Komentářů: 17
    dnes 04:33 | IT novinky

    Thomas Dohmke, bývalý CEO GitHubu, představil startup Entire - platformu pro spolupráci vývojářů a agentů umělé inteligence. Entire získalo rekordních 60 milionů dolarů na vývoj databáze a nástrojů, které mají zefektivnit spolupráci mezi lidmi a agenty umělé inteligence. Dohmke zdůrazňuje potřebu přepracovat tradiční vývojové postupy tak, aby odpovídaly realitě, kdy většinu kódu produkuje umělá inteligence.

    NUKE GAZA! 🎆 | Komentářů: 0
    dnes 04:22 | Zajímavý projekt

    Toyota Connected North America oznámila vývoj open-source herního enginu Fluorite, postaveného na frameworku Flutter. Pro renderování grafiky využívá 3D engine Filament od společnosti Google a dle svého tvrzení cílí na konzolovou kvalitu her. Fluorite je zřejmě navržen tak, aby fungoval i na méně výkonném hardware, což naznačuje možnost použití přímo v ICE systémech vozidel. Zdrojový kód zatím zveřejněný není.

    NUKE GAZA! 🎆 | Komentářů: 1
    dnes 04:11 | Bezpečnostní upozornění

    Byl vytvořen nástroj a postup pro překonání věkového ověření platforem Discord, Kick, Twitch, Snapchat (a možná dalších), kód je open-source a dostupný na GitHubu. Všechny tyto sítě používají stejnou službu k-ID, která určuje věk uživatele scanem obličeje a na původní server posílá pouze šifrovaná metadata, ty ale sociální síť už nedokáže sama nijak validovat, 'útok' spočívá ve vygenerování a podstrčení legitimně vypadajících ověřovacích metadat.

    NUKE GAZA! 🎆 | Komentářů: 9
    včera 14:11 | IT novinky

    Jihokorejská kryptoměnová burza Bithumb přiznala vážné selhání interních systémů, které ji vystavilo riziku sabotáže a nezabránilo chybné transakci v hodnotě přes 40 miliard dolarů (814 miliard Kč). Druhá největší kryptoměnová burza v Koreji minulý týden při propagační akci omylem rozeslala zákazníkům zhruba 620 000 bitcoinů místo 620 000 wonů (8700 Kč). Incident vyvolal pokles ceny bitcoinu o 17 procent. Většinu

    … více »
    Ladislav Hagara | Komentářů: 9
    včera 13:55 | Nová verze

    Google Chrome 145 byl prohlášen za stabilní. Nejnovější stabilní verze 145.0.7632.45 přináší řadu novinek z hlediska uživatelů i vývojářů. Podrobný přehled v poznámkách k vydání. Zpátky je podpora grafického formátu JPEG XL, viz Platform Status. Odstraněna byla před třemi lety. Nový dekodér JPEG XL jxl-rs je napsán v Rustu. Zobrazování JPEG XL lze vyzkoušet na testovací stránce. Povolit lze v nastavení chrome://flags (Enable JXL image format).

    Ladislav Hagara | Komentářů: 0
    10.2. 22:44 | Nová verze

    Byla vydána nová verze 1.26 programovacího jazyka Go (Wikipedie). Přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (19%)
     (6%)
     (0%)
     (11%)
     (26%)
     (3%)
     (4%)
     (2%)
     (12%)
     (28%)
    Celkem 853 hlasů
     Komentářů: 25, poslední 3.2. 19:50
    Rozcestník

    Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    2.9.2009 22:43 | Přečteno: 1488× | programování | Výběrový blog

    Nedávno jsem psal pythoní modul pro zjišťování informací o video souborech přes fmpeg/libavformat. Protože se využívá sdílenou knihovnu slinkovanou proti libavformat, bylo potřeba dle zadání zajistit, aby segfault ffmpegu neshodil hlavní pythoní proces.

    Pythoní modul je vygenerován swig-em, který obaluje skutečný C++ kód. Sdílená knihovna načtena pythonem při importu. (Existuje projekt pyffmpeg, jenže ten umí zjistit jenom to, co ffmpeg vypíše na stdout/stderr.)

    Before SIGSEGV we bow

    Jediná možnost ochrany proti segfaultu je mít kód v separátním procesu (při odchycení SIGSEGV je již pozdě).

    Možnosti jsem viděl asi následovně:

    1. fork v C++ kódu + sdílená paměť
    2. fork v C++ kódu, serializovaná data posílat přes rouru (třeba s boost::serialization)
    3. fork v pythonu, sdílet data přes Python Object Sharing (POSH)
    4. subprocess.Popen v pythonu, posílat data serializovaná s cPickle přes rouru

    Varianty C++ s forkem

    První drobnou vadou na kráse je nepřenositelnost forku. Momentálně by to nebyl problém, ale mám radši přenositelný kód. Sdílená paměť je problematická se STL kontejnery, bylo by nutné psát vlastní STL alokátor, který bude alokovat paměť ve sdílené paměti (opruz). Boostí serializace je celkem elegantní, ale IMHO ne až tak elegantní jako pythoní cPickle.

    Varianty sdílení dat mezi procesy v pythonu

    POSH vypadal zajímavě, ale těžko říci jak moc je vyspělý, spíš mi přišel jako zajímavý výzkumný projekt, ale musel bych věnovat spoustu času abych zjistil jak je na tom se spolehlivostí.

    Vylučovací metodou zůstala poslední varianta, subprocess.Popen + cPickle. Modul cPickle umí (de)serializovat pythoní objekty bez nutnosti psát kód pro serializaci (až na výjimky).

    Bohužel mezi výjimky, které cPickle automaticky serializovat neumí, patří právě swigem vygenerované objekty, protože pro python jsou "neprůhledné". Naštestí to není problém rychle napravit ručně (opět modulo výjimky způsobeny implementační náladou swigu). Stačí nadefinovat __setstate__ a __getstate__.

    Příklad

    C++ header:

    struct Resolution
    {
        Resolution(): width(0), height(0) {}
        Resolution(int w, int h): width(w), height(h) {}
    
        int width;
        int height;
    };
    
    typedef std::map<std::string, std::string> Metadata_t;
    

    swigový zdroják:

    %include "std_string.i"
    %include "std_pair.i"
    %include "std_map.i"
    %include "pyiterators.swg"
    
    namespace std {
        %template(StringStringMap) map<string, string> 
    }
    
    %extend Resolution {
    %insert("python") %{
    def __getstate__(self):
        return (self.width, self.height)
    def __setstate__(self,tup):
        #zavolá konstruktor Resolution(width, height) s uloženým tuplem
        self.this = _pycffmpeg.new_Resolution(*tup)
        #říká, že python vlastní objekt a má ho pak zgarbagecollectovat
        self.thisown = 1
    %}
    }
    
    %extend std::map<std::string, std::string> {
    %insert("python") %{
    def __getstate__(self):
        metadataDict = {}
        metadataDict.update(self)
        return metadataDict
    def __setstate__(self,metadataDict):
        self.this = _pycffmpeg.new_StringStringMap()
        self.thisown = 1
        #self není dict, nemá update() metodu
        #zdání dictu dělá std_map.i a pyiterators.swg
        for (k, v) in metadataDict.iteritems():
            self[k] = v
    %}
    }
    

    Implementační nálada swigu

    U všech tříd výše uveden postup serializace přes dodefinování __setstate__ a __getstate__ fungoval, až na jednu. Konstruktor _pycffmpeg.new_FormatInfo z nějakého důvodu vracel const pointer místo normálního non-const. Netuším proč, spíše nějaký bug; swig interně rozlišuje typy objektů a signatury metod podle ním vygenerovaného stringu (proto je možné taky použít C++-style overloading, což normálně v pythonu nejde).

    Nakonec jsem to vyřešil ručně napsanou wrapper třídou "nezpicklovatelné" třídy, která jednoduše zkopíruje všechny atributy do sebe (není možné použít self.__dict__ u tříd generovaných swigem, mají jenom "this").

    Kdybyste měli nějaký jiný nápad na řešení sandboxování nativního kódu, rozhodně by mě to zajímalo.

           

    Hodnocení: 100 %

            špatnédobré        

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    Komentáře

    Vložit další komentář

    limit_false avatar 2.9.2009 22:56 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše FormatInfo

    Jenom poznámka kvůli úplnosti: FormatInfo je "nejvyšší" třída, obsahuje Duration, vector StreamInfo, které obsahují resolution, pixel aspect, display aspect atd.

    When people want prime order group, give them prime order group.
    2.9.2009 23:15 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu
    A proč nepoužít mediainfo nebo libmediainfo? Umí dost věcí, viz ukázka...
    General
    Complete name                    : /media/share/Freeski Films/Picture This/Picture.This.1080p.x264.mkv
    Format                           : Matroska
    File size                        : 1.50 GiB
    Duration                         : 33mn 42s
    Overall bit rate                 : 6 387 Kbps
    Encoded date                     : UTC 2009-03-15 13:44:06
    Writing application              : mkvmerge v2.5.3 ('Boogie') built on Mar  7 2009 15:00:41
    Writing library                  : libebml v0.7.7 + libmatroska v0.8.1
    
    Video
    Format                           : AVC
    Format/Info                      : Advanced Video Codec
    Format profile                   : High@L4.0
    Format settings, CABAC           : Yes
    Format settings, ReFrames        : 1 frame
    Muxing mode                      : Container profile=Unknown@4.0
    Codec ID                         : V_MPEG4/ISO/AVC
    Duration                         : 33mn 40s
    Bit rate                         : 5 742 Kbps
    Nominal bit rate                 : 6 000 Kbps
    Width                            : 1 920 pixels
    Height                           : 1 080 pixels
    Display aspect ratio             : 16/9
    Frame rate                       : 29.970 fps
    Resolution                       : 24 bits
    Colorimetry                      : 4:2:0
    Scan type                        : Progressive
    Bits/(Pixel*Frame)               : 0.097
    Title                            : PICTURE.THIS
    Writing library                  : x264 core 67 r1127M 8d82fec
    Encoding settings                : cabac=1 / ref=1 / deblock=1:0:0 / analyse=0x3:0x133 / me=hex / subme=6 / psy_rd=1.0:0.0 / mixed_ref=0 / me_range=16 / chroma_me=1 / trellis=0 / 8x8dct=1 / cqm=0 / deadzone=21,11 / chroma_qp_offset=-2 / threads=3 / nr=0 / decimate=1 / mbaff=0 / bframes=0 / keyint=300 / keyint_min=30 / scenecut=40 / rc=2pass / bitrate=6000 / ratetol=1.0 / qcomp=0.60 / qpmin=10 / qpmax=51 / qpstep=4 / cplxblur=20.0 / qblur=0.5 / ip_ratio=1.40 / aq=1:1.00
    Language                         : English
    
    Audio
    Format                           : AC-3
    Format/Info                      : Audio Coding 3
    Codec ID                         : A_AC3
    Duration                         : 33mn 42s
    Bit rate mode                    : Constant
    Bit rate                         : 384 Kbps
    Channel(s)                       : 2 channels
    Channel positions                : L R
    Sampling rate                    : 48.0 KHz
    Language                         : English
    
    Chapters
    Language                         : English
    1                                : 00:00:00.000 Intro
    2                                : 00:04:02.000 Seth Huot
    3                                : 00:06:38.000 Andreas Wiig
    4                                : 00:07:53.000 Wille Yli Luoma
    5                                : 00:10:41.000 Darrell Mathes
    6                                : 00:12:47.000 DCP
    7                                : 00:13:14.000 Etienne Gilbert
    8                                : 00:13:25.000 Hampus Mosesson
    9                                : 00:13:50.000 Shaun White Kevin Pearce
    10                               : 00:16:09.000 Jussi Oksanen
    11                               : 00:18:29.000 Eero Ettala
    12                               : 00:22:29.000 Heikki Sorsa
    13                               : 00:24:36.000 Aaron Biittner
    14                               : 00:29:11.000 Jeremy Jones
    15                               : 00:29:39.000 Credits
    
    
    limit_false avatar 3.9.2009 00:18 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Díky moc, MediaInfo jsem neznal. Vyzkoušel jsem to na několika speciálních zmršených případech, proti mojí metodě to má o jedno video lepší úspěšnost (největší problém je s display aspect ratio videa; videa a jejich kontejnery jsou různě zmršeny).

    N.B.: i kdybych MediaInfo znal, bych byl opatrnej. Původní kód používal ffmpeg na detekci, jenom někde to nefungovalo úplně správně. Když opravím známé speciální případy a pořád používám ffmpeg/libavformat, vím, že nerozbiju existující správné případy. Nicméně MediaInfo vypadá fakt použitelně. Jenom teď zrovna nevím který z reportovaných display aspectů bych použil ;-) Zatím original display aspect vypadá na ten správný.

    When people want prime order group, give them prime order group.
    limit_false avatar 5.9.2009 22:15 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Tak jsem zrovna objevil video fajl (ASF), kde ffmpeg hlasi delku 4.9 s, mplayer s asf demuxerem 11 s, mediainfo 8 s. Spravna je 11 sec. Jeste idealne ma v kontejneru nastaveno 1000 fps. Jsem videl ve zdrojacich ffmpegu a/nebo mplayeru specialni hack pro tohle chovani, chutovka.

    Podobne neni vubec vyjimkou ze u kontejneru je napsana jina delka videa nez u video streamu. Ach jo.

    When people want prime order group, give them prime order group.
    6.9.2009 13:22 kralyk z abclinuxu | skóre: 29 | blog:
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu
    Njn to je problém. Ale jsi si jistý, že i takový případ potřebuješ pokrýt? Hint ;-)
    limit_false avatar 6.9.2009 21:57 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Heh, specialnich pripadu je tak 25%, kazdy necim jiny (rozumej "jinak zmrsen"). Uz to mame celkem vychytany ale prekvapeni se tak brzo nezbavime.

    When people want prime order group, give them prime order group.
    2.9.2009 23:33 dark
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    A není to celé overkill? Pokud chci použít sdílenou knihovnu, ve které dojde k segfaultu, je to na bugreport a opravu v dané knihovně.

    limit_false avatar 2.9.2009 23:44 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    To sice ano, jenže nejprve chceme třeba vůbec mít v logu nějaké info že to segfaultlo (graceful fault). Taky je pak možné udělat nejaké cleanup akce, to nejde když segfault sestřelí hlavní pythoní proces. Pro představu se daný pythoní skript pouští cronem, rádově na 2-3 tisíc videí týdenně.

    Jinak obecně se segfaultům nedá vyhnout, model-checking ffmpegu by nedokázala zaplatit snad ani NASA ;-)

    When people want prime order group, give them prime order group.
    3.9.2009 09:08 Ondrej 'SanTiago' Zajicek
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    > Taky je pak možné udělat nejaké cleanup akce, to nejde když segfault sestřelí hlavní pythoní proces

    A nestacilo by tedy v tom Pythonu ten segfault obslouzit? Je to signal jako kazdy jiny.

    limit_false avatar 3.9.2009 10:07 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Jak jsem psal výše, IMHO je při odchycení SIGSEGV již pozdě. Nemáte žádnou jistotu, že je paměť v nějakém "minimálně" konzistentním stavu, aby bylo možné udělat cleanup. Snad by šlo zavolat mprotect, jenže v pythonu by to bylo dost komplikované, protože správa paměti je "odstíněna" od programátora.

    When people want prime order group, give them prime order group.
    limit_false avatar 3.9.2009 00:05 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Prvně bych změnil "ve které dojde k segfaultu" na "ve které může dojít k segfaultu".

    Já si rýpnu, ale když tenhle přístup porovnám proti filozofii Erlangu a vývoji v Erlangu, kdy se erlangovské procesy navzájem monitorují, okamžite se restartnou když zahučí a je možné měnit kód za běhu bez restartu služby, it feels a little bit inferior.

    When people want prime order group, give them prime order group.
    Marek Bernát avatar 3.9.2009 00:37 Marek Bernát | skóre: 17 | blog: Arcadia
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu
    Presne, Erlang je king. Veď je to nakoniec ľudská prirodzenosť: každý robí chyby. Softvér je plný bugov už z princípu a všetci o tom vedia. Napriek tomu sa ale ešte stále všetci tvária, že chyby sú niečo zlé. Dúfam, že v budúcnosti sa viac presadí aj v ostatných jazykoch erlangovský prístup, ktorý s chybami proste počíta.
    physics.stackexchange.com -- Q&A stránky o fyzike v štýle StackOverflow.
    3.9.2009 14:11 Michal Vyskočil | skóre: 60 | blog: miblog | Praha
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu
    Dúfam, že v budúcnosti sa viac presadí aj v ostatných jazykoch erlangovský prístup, ktorý s chybami proste počíta.
    Nemůžu se zbavit dojmu, že takový přístup se trochu mlátí s vedlejšími efetky, takže napasovat to do nefunkcionálního jazyka může být obtížné.
    When your hammer is C++, everything begins to look like a thumb.
    limit_false avatar 3.9.2009 23:33 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Marek měl na mysli spíš erlangovskou robustnost nežli kód bez vedlejších efektů (to je pak lepší/jednodušší rovnou použít Erlang proti simulaci "side-effect-lessness" v nefunkcionálním jazyku). V principu minimalizovat dopad fatální chyby kódu, která způsobí crash nebo buffer overflow. I v C/C++ aplikacích to není výjimka, viz třeba KDE, které restartne plasma-desktop po segfaultu. Buffer/heap overflow se pak dá řešit na úrovni OS (NX bit, ASLR, grsecurity, SELinux, AppArmor, stack-smash protectors, atd.)

    Hlavní důvod sandboxování ffmpegu byl, že by v naší aplikaci mohl způsobit race condition, kdy by se video soubor neostranil cleanupem z fronty (protože by se ho aplikace pořád snažila zpracovat, segfaultla, a pak znova).

    When people want prime order group, give them prime order group.
    3.9.2009 23:20 denix
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

     Miesto POSH a cpickle mozno by sa dalo pouzit 

    http://pyro.sourceforge.net/

    limit_false avatar 3.9.2009 23:55 limit_false | skóre: 23 | blog: limit_false
    Rozbalit Rozbalit vše Re: Sandboxování ne-bezpečného C/C++ kódu v Pythonu

    Podíval jsem se na PYRO, stejně myslím že by měl podobné problémy jako cPickle, pro Python jsou ty swigem obalené objekty "neprůhledné". Speciálně je asi nebude možné podědit z Pyro.core.ObjBase, swig vyžaduje dědění z vlastní třídy _object.

    Jinak výborný projekt pro RPC je ZeroC ICE, integrace s mnoha jazyky (C/C++, Java, Python...). Hrál jsem se s tím jenom chvíli, ale je to fakt paráda.

    When people want prime order group, give them prime order group.

    Založit nové vláknoNahoru

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.