Analisis de un Bug: 'imlib2' Library 'load()' CVE-2008-5187
Bueno toda esta mania surgio de cuando trate de instalar enlightenment sencillamente me decia que habia un bug en alguna dependecia de este, y no me dejaba instalarlo hasta que actualizara o aplicara el parche.
Mas Info:
FreeBSD: Problema con imlib2-1.4.1.000 (Solucion)
CVE-2008-5187
Advisor Original:
Antecedentes
Imlib2 es el succesor de Imlib, Esto no es una nueva version, solo es una bibliotecas totalmente nueva. Imlib2 puede ser completamente instalado aun existiendo Imlib 1.x esto sin ningun problema, ya que efectivamente son diferentes bibliotecas pero con funciones muy similares.
Si bien no forma estrictamente parte de la EFL, la biblioteca es utilizada imlib2 por la EFL para el manejo, visualización y manipulación de gráficos a bajo nivel. Es capaz de cargar y manipular archivos de gráficos de muchos formatos, y también es capaz de mostrar en un X Window System. Los desarrolladores cuentan con imlib2 que es muy optimizado.
XPM es una formato de imagen, basdo en Texto/ASCII Usado pro el X Window System, Su principal Intencion fue para crear Iconos, pixmaps y soportar colores traparentes.
Un ejemplo de una imagen XMP
16*7 black and white pixels.
Version: imlib2-1.4.1.000
Codigo Vulnerable: loader_xpm.c
Funcion Vulnerable: load
Analizando el parche tenemos que:
Funcion vulnerable:
Linea 250:
Funcion NO vulnerable
Linea 250:
Viendolo solo desde el diff:
Al parecer solo la variable end, es la que nos ocaciona el desbordamiento, al utilizarla en otra parte del codigo.
Lo que pasa es que end, es un apuntador al final, sin embargo:
Esto da algo mayor a solo
El punto esta en que la cifra se hace 4 veces mas grande:
Tamaño de DATA32: 4 bytes
Como podemos ver estaba multiplicando el espacio por 4
Las variables pixels,w,h son enteros.
ptr y end son apuntadores a DATA32
im es un apuntador a ImlibImage, el cual es pasao como parametro directamente a la funcion.
Bien ahora probaremos el programa, transformando una Imagen xmp a png xD.
Este ejemplo lo tome de la documentacion de imlib2
Compilando:
Bueno es un warning pero a mi no me gusta que eso aparezca, le agrego el #include<stdlib.h>
Creado la prueba obtenemos que si transforma la imagen a un png, Segun la documentacion puede transformar de culquier extensión a cualqueir extensión!!
Ahora esto solo es una prueba del funcionamiento, ya que obviamente se mando a llamar a la funcion vulnerable sin embargo se cargo con buenos datos.
Vamos a ver como es que se puede hacer caer esto, Segun el advisor Original la falla fue encontrada con una imagen de 32 * 32 pixeles sin embargo como no se da mas informacion, no nos queda mas que depurar, para esto va a ser necesario modificar el make file de los ports en mi caso FreeBSD, en algunos otros casos va a ser necesario modificar el .configure o diferentes.
Bien, antes de depurar las librerias, vamos a depurar la pequeña aplicacion que compilamos.
Bueno no entro a la funcion deseada debido al funcionamiento de step, pero igual tratemos de nuevo
:S la cosa se complica, vere a donde llego con esto y si veo que de plano es muy complicado, agrego la informacion de las librerias imlib2
Interesante: __imlib_LoadImage
Existe esta subfuncion que carga la imagen.. pero ya la vi y son como 1000 Lineas de ensamblador xD asi que mejor no.
Bien, compilado todo con opciones -ggdb tanto el programa de ejemplo como la libreria imlib2
Detengo un poco a la ejecucion para buscar api.c y ver quien es la variable ctx, despues de indagar en todo api.c no veo donde define ctx pero puedeo inferir que se trata de un apuntador a Imlib_Image
Siguiendo con la depuracion vemos hasta donde llega, ahorita solo me interesa saber si el ejemplo que estamos usando, llega a llamar a la funcion load del archivo loader_xpm.c y si esto es asi sabremos
que vamos por buen camino
Cientos de Instrucciones mas y al parecer es, pero creo que no se parace la funcion pero esta pertecene al archivo image.c y la que buscamos es del loader_xpm.c
Despues de unas 2000 Instrucciones queda solo una salida Inesperada
Jaja que cosas pasan xD ya se voy a editar el archivo loader_xpm.c para en caso de que si se mande a llamar Solo mando un "OK loader
\n"
Depues de realizar la modificacion xD,vi que no dunciono, o no lo carga el moduo vulnerable:
No se por que pero si lo compilo con los argumentos -ggdb -static simplemente no lo hace y se le compilo normal si hace lo pedido.
Entonces tendre que mandarle yo mismo el archivo, asi sirve que no paso por tanto filtros. Sin embargo eso sera otro dia.
Mas Info:
FreeBSD: Problema con imlib2-1.4.1.000 (Solucion)
CVE-2008-5187
Advisor Original:
Código:
http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=505714
Antecedentes
Imlib2 es el succesor de Imlib, Esto no es una nueva version, solo es una bibliotecas totalmente nueva. Imlib2 puede ser completamente instalado aun existiendo Imlib 1.x esto sin ningun problema, ya que efectivamente son diferentes bibliotecas pero con funciones muy similares.
Si bien no forma estrictamente parte de la EFL, la biblioteca es utilizada imlib2 por la EFL para el manejo, visualización y manipulación de gráficos a bajo nivel. Es capaz de cargar y manipular archivos de gráficos de muchos formatos, y también es capaz de mostrar en un X Window System. Los desarrolladores cuentan con imlib2 que es muy optimizado.
XPM es una formato de imagen, basdo en Texto/ASCII Usado pro el X Window System, Su principal Intencion fue para crear Iconos, pixmaps y soportar colores traparentes.
Código:
http://en.wikipedia.org/wiki/X_PixMap
Un ejemplo de una imagen XMP
16*7 black and white pixels.
Citar
/* XPM */
static char *prueba[] = {
"16 7 2 1",
"* c #ffffff",
". c #000000",
"**..*...........",
"*.*.*...........",
"**..*..**.**..**",
"*.*.*.*.*.*..*.*",
"**..*..**.*...**",
"...............*",
".............**."
};
static char *prueba[] = {
"16 7 2 1",
"* c #ffffff",
". c #000000",
"**..*...........",
"*.*.*...........",
"**..*..**.**..**",
"*.*.*.*.*.*..*.*",
"**..*..**.*...**",
"...............*",
".............**."
};
Version: imlib2-1.4.1.000
Codigo Vulnerable: loader_xpm.c
Funcion Vulnerable: load
Analizando el parche tenemos que:
Funcion vulnerable:
Linea 250:
Código:
ptr = im->data;
end = ptr + (sizeof(DATA32) * w * h);
pixels = w * h;
}
Funcion NO vulnerable
Linea 250:
Código:
ptr = im->data;
pixels = w * h;
end = ptr + pixels;
}
Citar
# diff imlib2-1.4.1.000/imlib2-1.4.1.000/src/modules/loaders/loader_xpm.c /usr/ports/graphics/imlib2/work/imlib2-1.4.1.000/src/modules/loaders/loader_xpm.c
251d250
< end = ptr + (sizeof(DATA32) * w * h);
252a252
> end = ptr + pixels;
251d250
< end = ptr + (sizeof(DATA32) * w * h);
252a252
> end = ptr + pixels;
Al parecer solo la variable end, es la que nos ocaciona el desbordamiento, al utilizarla en otra parte del codigo.
Lo que pasa es que end, es un apuntador al final, sin embargo:
Código:
(sizeof(DATA32) * w * h)
Esto da algo mayor a solo
Código:
pixels = w * h;
end = ptr + pixels;
El punto esta en que la cifra se hace 4 veces mas grande:
Código:
/* standard headers */
#include <X11/Xlib.h>
#include <Imlib2.h>
#include <stdio.h>
int main() {
printf("Tamaño de DATA32: %d bytes\n",sizeof(DATA32));
return 0;
}
Citar
%./imlibtest
Tamaño de DATA32: 4 bytes
Tamaño de DATA32: 4 bytes
Tamaño de DATA32: 4 bytes
Como podemos ver estaba multiplicando el espacio por 4
Las variables pixels,w,h son enteros.
ptr y end son apuntadores a DATA32
im es un apuntador a ImlibImage, el cual es pasao como parametro directamente a la funcion.
Bien ahora probaremos el programa, transformando una Imagen xmp a png xD.
Este ejemplo lo tome de la documentacion de imlib2
Código:
/* standard headers */
#include <X11/Xlib.h>
#include <Imlib2.h>
#include <stdio.h>
#include <string.h>
/* main program */
int main(int argc, char **argv)
{
/* an image handle */
Imlib_Image image;
/* if we provided < 2 arguments after the command - exit */
if (argc != 3) exit(1);
/* load the image */
image = imlib_load_image(argv[1]);
/* if the load was successful */
if (image)
{
char *tmp;
/* set the image we loaded as the current context image to work on */
imlib_context_set_image(image);
/* set the image format to be the format of the extension of our last */
/* argument - i.e. .png = png, .tif = tiff etc. */
tmp = strrchr(argv[2], '.');
if(tmp)
imlib_image_set_format(tmp + 1);
/* save the image */
imlib_save_image(argv[2]);
}
}
Citar
Now to compile this
cc imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
You now have a program that if used as follows:
./imlib2_convert image1.jpg image2.png
cc imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
You now have a program that if used as follows:
./imlib2_convert image1.jpg image2.png
Compilando:
Citar
%cc imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
imlib2_convert.c: In function 'main':
imlib2_convert.c:14: warning: incompatible implicit declaration of built-in function 'exit'
imlib2_convert.c: In function 'main':
imlib2_convert.c:14: warning: incompatible implicit declaration of built-in function 'exit'
Bueno es un warning pero a mi no me gusta que eso aparezca, le agrego el #include<stdlib.h>
Creado la prueba obtenemos que si transforma la imagen a un png, Segun la documentacion puede transformar de culquier extensión a cualqueir extensión!!
Ahora esto solo es una prueba del funcionamiento, ya que obviamente se mando a llamar a la funcion vulnerable sin embargo se cargo con buenos datos.
Vamos a ver como es que se puede hacer caer esto, Segun el advisor Original la falla fue encontrada con una imagen de 32 * 32 pixeles sin embargo como no se da mas informacion, no nos queda mas que depurar, para esto va a ser necesario modificar el make file de los ports en mi caso FreeBSD, en algunos otros casos va a ser necesario modificar el .configure o diferentes.
Bien, antes de depurar las librerias, vamos a depurar la pequeña aplicacion que compilamos.
Citar
%cc -ggdb imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
%cc -ggdb -static imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
/usr/local/lib/libX11.a(ConnDis.o)(.text+0x9e8): In function `_X11TransConnectDisplay':
: undefined reference to `XauDisposeAuth'
/usr/local/lib/libX11.a(ConnDis.o)(.text+0xcbf): In function `_X11TransConnectDisplay':
: undefined reference to `XauGetBestAuthByAddr'
/usr/local/lib/libX11.a(ConnDis.o)(.text+0xf1a): In function `_X11TransConnectDisplay':
: undefined reference to `XdmcpWrap'
Me marca erros al querer incluirlo estaticamente, tendre que probarlo normal solo con -ggdb y vemos que pasa%cc -ggdb -static imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
/usr/local/lib/libX11.a(ConnDis.o)(.text+0x9e8): In function `_X11TransConnectDisplay':
: undefined reference to `XauDisposeAuth'
/usr/local/lib/libX11.a(ConnDis.o)(.text+0xcbf): In function `_X11TransConnectDisplay':
: undefined reference to `XauGetBestAuthByAddr'
/usr/local/lib/libX11.a(ConnDis.o)(.text+0xf1a): In function `_X11TransConnectDisplay':
: undefined reference to `XdmcpWrap'
Citar
%gdb ./imlib2_convert
GNU gdb 6.1.1 [FreeBSD]
....
This GDB was configured as "i386-marcel-freebsd"...
(gdb) list
1 /* standard headers */
2 #include <X11/Xlib.h>
3 #include <Imlib2.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 /* main program */
9 int main(int argc, char **argv)
10 {
(gdb) break main
Breakpoint 1 at 0x80486c0: file imlib2_convert.c, line 10.
(gdb) run ./prueba.xpm ./prueba.png
Starting program: /usr/home/Anon/imlib2_convert ./prueba.xpm ./prueba.png
Breakpoint 1, main (argc=Error accessing memory address 0x0: Bad address.
) at imlib2_convert.c:10
10 {
(gdb) step
main (argc=3, argv=0xbfbfec9c) at imlib2_convert.c:15
15 if (argc != 3) exit(1);
(gdb) step
17 image = imlib_load_image(argv[1]);
(gdb) step
19 if (image)
(gdb) step
23 imlib_context_set_image(image);
(gdb)
26 tmp = strrchr(argv[2], '.');
(gdb)
27 printf("extensión: %s\n",tmp);
(gdb)
extensión: .png
28 if(tmp)
(gdb)
29 imlib_image_set_format(tmp + 1);
(gdb)
31 imlib_save_image(argv[2]);
(gdb)
36 }
(gdb)
0x08048649 in _start ()
(gdb)
Single stepping until exit from function _start,
which has no line number information.
Program exited with code 0200.
(gdb) quit
GNU gdb 6.1.1 [FreeBSD]
....
This GDB was configured as "i386-marcel-freebsd"...
(gdb) list
1 /* standard headers */
2 #include <X11/Xlib.h>
3 #include <Imlib2.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 /* main program */
9 int main(int argc, char **argv)
10 {
(gdb) break main
Breakpoint 1 at 0x80486c0: file imlib2_convert.c, line 10.
(gdb) run ./prueba.xpm ./prueba.png
Starting program: /usr/home/Anon/imlib2_convert ./prueba.xpm ./prueba.png
Breakpoint 1, main (argc=Error accessing memory address 0x0: Bad address.
) at imlib2_convert.c:10
10 {
(gdb) step
main (argc=3, argv=0xbfbfec9c) at imlib2_convert.c:15
15 if (argc != 3) exit(1);
(gdb) step
17 image = imlib_load_image(argv[1]);
(gdb) step
19 if (image)
(gdb) step
23 imlib_context_set_image(image);
(gdb)
26 tmp = strrchr(argv[2], '.');
(gdb)
27 printf("extensión: %s\n",tmp);
(gdb)
extensión: .png
28 if(tmp)
(gdb)
29 imlib_image_set_format(tmp + 1);
(gdb)
31 imlib_save_image(argv[2]);
(gdb)
36 }
(gdb)
0x08048649 in _start ()
(gdb)
Single stepping until exit from function _start,
which has no line number information.
Program exited with code 0200.
(gdb) quit
Bueno no entro a la funcion deseada debido al funcionamiento de step, pero igual tratemos de nuevo
:S la cosa se complica, vere a donde llego con esto y si veo que de plano es muy complicado, agrego la informacion de las librerias imlib2
Citar
(gdb) disas imlib_load_image
Dump of assembler code for function imlib_load_image:
0x2808cbe0 <imlib_load_image+0>: push %ebp
0x2808cbe1 <imlib_load_image+1>: mov %esp,%ebp
.....
0x2808cc3e <imlib_load_image+94>: call 0x280a1190 <__imlib_LoadImage>
....
0x2808cc56 <imlib_load_image+118>: mov 0xfffffffc(%ebp),%edi
0x2808cc59 <imlib_load_image+121>: mov %ebp,%esp
0x2808cc5b <imlib_load_image+123>: pop %ebp
0x2808cc5c <imlib_load_image+124>: ret
....
End of assembler dump.
Dump of assembler code for function imlib_load_image:
0x2808cbe0 <imlib_load_image+0>: push %ebp
0x2808cbe1 <imlib_load_image+1>: mov %esp,%ebp
.....
0x2808cc3e <imlib_load_image+94>: call 0x280a1190 <__imlib_LoadImage>
....
0x2808cc56 <imlib_load_image+118>: mov 0xfffffffc(%ebp),%edi
0x2808cc59 <imlib_load_image+121>: mov %ebp,%esp
0x2808cc5b <imlib_load_image+123>: pop %ebp
0x2808cc5c <imlib_load_image+124>: ret
....
End of assembler dump.
Interesante: __imlib_LoadImage
Existe esta subfuncion que carga la imagen.. pero ya la vi y son como 1000 Lineas de ensamblador xD asi que mejor no.
Bien, compilado todo con opciones -ggdb tanto el programa de ejemplo como la libreria imlib2
Citar
%cc -ggdb -static imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
%gdb ./imlib2_convert>
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) list
1 /* standard headers */
2 #include <X11/Xlib.h>
3 #include <Imlib2.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 /* main program */
9 int main(int argc, char **argv)
10 {
(gdb)
11 /* an image handle */
12 Imlib_Image image;
13
14 /* if we provided < 2 arguments after the command - exit */
15 if (argc != 3) exit(1);
16 /* load the image */
17 image = imlib_load_image(argv[1]);
18 /* if the load was successful */
19 if (image)
20 {
(gdb) break 13
Breakpoint 1 at 0x8048224: file imlib2_convert.c, line 13.
(gdb) run ./prueba.xpm ./prueba.png
Starting program: /usr/home/Anon/imlib2_convert ./prueba.xpm ./prueba.png
Breakpoint 1, main (argc=3, argv=0xbfbfec9c) at imlib2_convert.c:15
15 if (argc != 3) exit(1);
(gdb) step
17 image = imlib_load_image(argv[1]);
(gdb) step
imlib_load_image (file=0xbfbfedaa "./prueba.xpm") at api.c:1166
1166 CHECK_CONTEXT(ctx);
(gdb) step
1162 {
(gdb)
1166 CHECK_CONTEXT(ctx);
(gdb)
_imlib_context_get () at api.c:217
217 context = imlib_context_new();
%gdb ./imlib2_convert>
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...
(gdb) list
1 /* standard headers */
2 #include <X11/Xlib.h>
3 #include <Imlib2.h>
4 #include <stdio.h>
5 #include <string.h>
6 #include <stdlib.h>
7
8 /* main program */
9 int main(int argc, char **argv)
10 {
(gdb)
11 /* an image handle */
12 Imlib_Image image;
13
14 /* if we provided < 2 arguments after the command - exit */
15 if (argc != 3) exit(1);
16 /* load the image */
17 image = imlib_load_image(argv[1]);
18 /* if the load was successful */
19 if (image)
20 {
(gdb) break 13
Breakpoint 1 at 0x8048224: file imlib2_convert.c, line 13.
(gdb) run ./prueba.xpm ./prueba.png
Starting program: /usr/home/Anon/imlib2_convert ./prueba.xpm ./prueba.png
Breakpoint 1, main (argc=3, argv=0xbfbfec9c) at imlib2_convert.c:15
15 if (argc != 3) exit(1);
(gdb) step
17 image = imlib_load_image(argv[1]);
(gdb) step
imlib_load_image (file=0xbfbfedaa "./prueba.xpm") at api.c:1166
1166 CHECK_CONTEXT(ctx);
(gdb) step
1162 {
(gdb)
1166 CHECK_CONTEXT(ctx);
(gdb)
_imlib_context_get () at api.c:217
217 context = imlib_context_new();
Detengo un poco a la ejecucion para buscar api.c y ver quien es la variable ctx, despues de indagar en todo api.c no veo donde define ctx pero puedeo inferir que se trata de un apuntador a Imlib_Image
Siguiendo con la depuracion vemos hasta donde llega, ahorita solo me interesa saber si el ejemplo que estamos usando, llega a llamar a la funcion load del archivo loader_xpm.c y si esto es asi sabremos
que vamos por buen camino
Citar
(gdb) step
imlib_context_new () at api.c:171
171 ImlibContext *context = malloc(sizeof(ImlibContext));
(gdb)
181 context->anti_alias = 1;
(gdb)
182 context->dither = 0;
(gdb)
183 context->blend = 1;
(gdb)
184 context->color_modifier = NULL;
(gdb)
185 context->operation = IMLIB_OP_COPY;imlib_context_new () at api.c:171
171 ImlibContext *context = malloc(sizeof(ImlibContext));
(gdb)
181 context->anti_alias = 1;
(gdb)
182 context->dither = 0;
(gdb)
183 context->blend = 1;
(gdb)
184 context->color_modifier = NULL;
(gdb)
Cientos de Instrucciones mas y al parecer es, pero creo que no se parace la funcion pero esta pertecene al archivo image.c y la que buscamos es del loader_xpm.c
Citar
(gdb)
__imlib_LoadImage (file=0xbfbfedaa "./prueba.xpm", progress=0, progress_granularity=0 '\0', immediate_load=0 '\0',
dont_cache=0 '\0', er=0x0) at image.c:979
979 if ((im) && (IMAGE_IS_VALID(im)))
(gdb)
975 im = __imlib_FindCachedImage(file);
(gdb)
979 if ((im) && (IMAGE_IS_VALID(im)))
__imlib_LoadImage (file=0xbfbfedaa "./prueba.xpm", progress=0, progress_granularity=0 '\0', immediate_load=0 '\0',
dont_cache=0 '\0', er=0x0) at image.c:979
979 if ((im) && (IMAGE_IS_VALID(im)))
(gdb)
975 im = __imlib_FindCachedImage(file);
(gdb)
979 if ((im) && (IMAGE_IS_VALID(im)))
Despues de unas 2000 Instrucciones queda solo una salida Inesperada
Citar
(gdb)
320 free(l);
(gdb)
322 }
(gdb)
__imlib_FileFreeDirList (l=0xbfbfeba8, num=Variable "num" is not available.
) at file.c:320
320 free(l);
(gdb)
Error
Program exited with code 012.
320 free(l);
(gdb)
322 }
(gdb)
__imlib_FileFreeDirList (l=0xbfbfeba8, num=Variable "num" is not available.
) at file.c:320
320 free(l);
(gdb)
Error
Program exited with code 012.
Jaja que cosas pasan xD ya se voy a editar el archivo loader_xpm.c para en caso de que si se mande a llamar Solo mando un "OK loader
Depues de realizar la modificacion xD,vi que no dunciono, o no lo carga el moduo vulnerable:
Citar
%cc -ggdb -static imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
%./imlib2_convert ./prueba.xpm ./prueba.png
Error
%cc imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
%./imlib2_convert ./prueba.xpm ./prueba.png
extensión: .png
%./imlib2_convert ./prueba.xpm ./prueba.png
Error
%cc imlib2_convert.c -o imlib2_convert `imlib2-config --cflags` `imlib2-config --libs`
%./imlib2_convert ./prueba.xpm ./prueba.png
extensión: .png
No se por que pero si lo compilo con los argumentos -ggdb -static simplemente no lo hace y se le compilo normal si hace lo pedido.
Entonces tendre que mandarle yo mismo el archivo, asi sirve que no paso por tanto filtros. Sin embargo eso sera otro dia.
Comentarios