and Profit ― Security.Tokyo #1 T wi t t erロゴ : ht t ps : // about .t wi t t er.com / en/ who-we-are/ brand-t ool k i t G i t Hubロゴ : ht t ps : // gi t hub.com / l ogos
2023? Because old WebKit-based browsers are still running even in 2023... 2. Stop Using QtWebKit and also Wkhtmltopdf If an attacker feed a malicious HTML to QtWebKit-based browser like wkhtmltopdf, your system could be compromised! 3. Demo ― CVE-2012-3748 The demo probably works for me... Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 3
Wiiシリーズ、etc…) そして、叩き方を教えてくれる "Exploiting WebKit on Vita 3.60" by @xyzz "Attacking JavaScript Engines: A case study of JavaScriptCore and CVE-2016-4622" by @saelo "Ode to the use-after-free: one vulnerable function, a thousand possibilities" by @scarybeasts この記事を参考にしてExploitを書きました etc… ググるときのキーワード: webkit, javascriptcore (jsc), vuln, exploit, pwn Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 6
"On WebKit Security Updates" というブログ記事の中で問題を指摘していた Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 …Do not feed untrusted data into QtWebKit. Don’t give it any HTML that you didn’t write yourself, and certainly don’t give it anything that contains injected data. Uninstall it and whatever applications depend on it. “ ” Linux distributions have a problem with WebKit security. “ ” 10
= 0; // Iterate over the array, ignoring missing values, counting undefined ones, and inserting all other ones into the tree. for (; numDefined < usedVectorLength; ++numDefined) { JSValue v = storage->m_vector[numDefined].get(); // storageの指す領域は以前のm_storageとして使われていないかも! if (!v || v.isUndefined()) break; tree.abstractor().m_nodes[numDefined].value = v; tree.insert(numDefined); // コールバックが呼ばれる } for (unsigned i = numDefined; i < usedVectorLength; ++i) { JSValue v = storage->m_vector[i].get(); // storageの指す領域は以前のm_storageとして使われていないかも! if (v) { if (v.isUndefined()) ++numUndefined; else { tree.abstractor().m_nodes[numDefined].value = v; tree.insert(numDefined); // コールバックが呼ばれる ++numDefined; } } } ... Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 14
if (SparseArrayValueMap* map = storage->m_sparseValueMap) { // storageの指す領域は以前のm_storageとして使われていないかも! newUsedVectorLength += map->size(); if (newUsedVectorLength > m_vectorLength) { // Check that it is possible to allocate an array large enough to hold all the entries. if ((newUsedVectorLength > MAX_STORAGE_VECTOR_LENGTH) || !increaseVectorLength(newUsedVectorLength)) { ... // エラーを返してリターンする } } storage = m_storage; // increaseVectorLength(newUsedVectorLength)で確保し直すが、結局はm_storageを保持してしまっている SparseArrayValueMap::iterator end = map->end(); // map の終端も保持されてしまう for (SparseArrayValueMap::iterator it = map->begin(); it != end; ++it) { tree.abstractor().m_nodes[numDefined].value = it->second.get(); tree.insert(numDefined); // コールバックが呼ばれる ++numDefined; } ... delete map; // mapの指す領域は以前のstorage->m_sparseValueMapとして使われていないかも! storage->m_sparseValueMap = 0; // storageの指す領域は以前のm_storageとして使われていないかも! } ... Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 15
back into m_storage. AVLTree<AVLTreeAbstractorForArrayCompare, 44>::Iterator iter; iter.start_iter_least(tree); JSGlobalData& globalData = exec->globalData(); for (unsigned i = 0; i < numDefined; ++i) { // storageの指す領域は以前のm_storageとして使われていないかも! storage->m_vector[i].set(globalData, this, tree.abstractor().m_nodes[*iter].value); ++iter; } // Put undefined values back in. for (unsigned i = numDefined; i < newUsedVectorLength; ++i) storage->m_vector[i].setUndefined(); // storageの指す領域は以前のm_storageとして使われていないかも! // Ensure that unused values in the vector are zeroed out. for (unsigned i = newUsedVectorLength; i < usedVectorLength; ++i) storage->m_vector[i].clear(); // storageの指す領域は以前のm_storageとして使われていないかも! storage->m_numValuesInVector = newUsedVectorLength; // storageの指す領域は以前のm_storageとして使われていないかも! ... } ... Pwning Old Webkit for Fun and Profit ― Security.Tokyo #1 16