Como los permisos permiten a un applet o una aplicación sobreescribir el policía de seguridad por defecto, deberíamos ser muy cuidadosos cuando asignemos permisos para no crear una antrada al código malicioso para que ataque nuestro sistema.
Este apéndice describe los permisos disponibles y explica cómo cada permiso puede crear una entrada para un ataque de código malicioso. Una forma de usar esta información es ayudarnos a limitar los permisos dados a un applet o una aplicación a sólo los necesarios para su ejecución. Otra forma de usar esta información es para aprender nosotros mismos las formas en que un permisi particular puede ser explotado por código malicioso.
Como consejo, nunca creas en un applet o una aplicación desconocidos. Siempre chequea el código cuidadosamente con la información de este apéndice para asegurarte de que no ofreces permisos a codigo malicios que cause serios problemas en el sistema local.
Por ejemplo, la siguiente entrada de fichero de policía especifica un permiso java.io.FilePermission que concede acceso de read (la acción) a la fuente ${user.home}/text2.txt.
grant {
permission java.io.FilePermission
"${user.home}/text2.txt", "read";
};
Hay un fichero de policía de la instalación de la plataforma Java (Sistema) y opcionalmente un fichero de policía por cada usuario. El fichero de policía del sistema está en {java.home}/lib/security/java.policy, y el fichero de policía de usuario está en cada directorio home de los usuarios. Los ficheros de policía de sistema y de usuario se combinan. Por eso por ejemplo, podría haber un fichero de policía con muy pocos permisos concedidos a todos los usuarios del sistema, y un fichero de policía individual concediendo permisos adicionales a ciertos usuarios.
Para ejecutar una aplicación con el controlador de seguridad y un fichero de policía llamado polfile en el directorio home del usuario, tecleamos:
Para ejecutar un applet en el aplletviewer con un fichero de policía llamando polfile en el directorio home del usuario, tecleamos:java -Djava.security.main -DJava.security.policy=polfile FileIO
Cuando ejecutamos un applet en un navegador, este busca los ficheros de policía de usuario y del sistema para encontrar los permisos que necesita el applet para acceder a los recursos del sistema local en representación del usuario que descargó el applet.appletviewer -J-Djava.security.policy=polfile fileIO.html
Otra forma de determinar qué permisos necesita nuestro programa es visitar Apéndice B: Métodos y Permisos. Este apéndice nos cuenta qué métodos de la plataforma Java 2 tienen impedida la ejecución sin los permisos listados. La información del Apéndice B también es útil para los desarrolladores que quieran escribir su propio controlador de seguridad para personalizar las verificaciones y aprovaciones necesarias en un programa.
Aquí tenemos un pequeño ejemplo que nos muestra como traducir el primer par de líneas del seguimiento de pila en una entrada del fichero de policí. La primera línea nos dice que el acceso está denegado. Esto significa que el seguimiento de pila fue generado porque el programa intentó acceder a recursos del sistema sin el permiso apropiado. La segunda línea significa que necesitamos un java.net.SocketPermission que le de programa permiso para connect y para resolveel nombre de host para la dirección (IP) 129.144.176.176, puerto 1521.
java.security.AccessControlException: access denied
(java.net.SocketPermission
129.144.176.176:1521 connect,resolve)
Para volver esto en una entrada del fichero de policía, listamos el nombre del permiso, una fuente, u una lista de acciones donde java.net.SocketPermission es el nombre del permiso,
129.144.176.176:1521 es la fuente, y connect,resolve es la lista de acciones:
grant {
permission java.net.SocketPermission
"129.144.176.176:1521", "connect,resolve";
};
grant {
permission java.security.AllPermission;
};
grant {
permission java.awt.AWTPermission
"accessClipboard";
permission java.awt.AWTPermission
"accessEventQueue";
permission java.awt.AWTPermission
"showWindowWithoutWarningBanner";
};
accessClipboard: Esta fuente concede permiso para poner información y para recuperarla desde el portapapeles del AWT. Conceder este permiso puede permitir a código malicioso que comparta informacion potencialmente sensible o confidencial.
accessEventQueue: Esta fuente concede permiso para acceder a la cola de eventos del AWT. Conceder este permiso podría permitir a código mailicioso que observe y elimine eventos del sistema, y ponga eventos falsos que podrían causar que la aplicación o el appler realizarán acciones maliciosas.
listenToAllAWTEvents: Esta fuente concede permiso para escuvhar todos los eventos AWT a través del sistema. Conceder este permiso podría permitir a código malicios lea y explote entradas confidenciales del usuario como las passwords.
Cada oyente de evento AWT es llamado desde dentro del contexto EventDispatchThread de la cola de eventos, por eso si también está activado el permiso accessEventQueue, código malicioso podría modificar el contenido de la cola de eventos del AWT a través del sistema, lo que podría causar que el applet o la aplicación realizarán acciones maliciosas.
readDisplayPixels: Esta fuente concede permiso para leer pixels desde la pantalla. Condeder este permiso podría permitir a interfaces como java.awt.Composite permitan examinar los pixels de la pantalla y fisgonee las actividades del usuario.
showWindowWithoutWarningBanner: Esta fuene concede permiso para mostrar una ventana sin mostrar el aviso de que la ventana fue creada por un applet. Sin este aviso, un applet podría mostrar ventanas si que el usuario supiera que pertenecen al applet. Esto podría ser un problema en entornos dónde el usuario toma decisiones sensibles de seguridad básandose en a quién pertenece la ventana si a un applet o a una aplicación. Por ejemplo, desactivar este aviso podría significar que el usuario introdujeta información sensile como el nombre de usuario y la password.
Este fichero de policía concede permisos de lectura, escritura, borrado y ejecución para todos los ficheros.
grant {
permission java.io.FilePermission
"<<ALL FILES>>", "read, write, delete, execute";
};
Este fichero de policía concede permiso de lectura y escritura sobre text.txt en el directorio home del usuario.
grant {
permission java.io.FilePermission
"${user.home}/text.txt", "read, write";
};
Podemos usar los siguiente comodines para especificar al pathname de la fuente:
Cuando concedamos permisos de ficheros, siempre debemos pensar en las implicaciones de conceder permisos de lectura y especialmente de escritura a varios ficheros y directorios. El permiso <<ALL FILES>> con acción de escritura es especialmente peligroso porque concede permiso para escribir en todo el sistema de ficheros. Esto significa que el sistema binario puede ser reemplazado, lo que incluye el entorno de ejecución de la máquina virtual Java.
grant {
permission java.net.NetPermission
"setDefaultAuthenticator";
permission java.net.NetPermission
"requestPasswordAuthentication";
};
setDefaultAuthenticator: Esta fuente concede permiso para seleccionar la forma en que información de autentificación es recuperad cuando un proxy o un servidor HTTP piden autentificación. Concedere ste permiso podría significar que código mailicioso puede seleccinar un autentificador que monitorice y robe la entrada de autentificación del usuario como si recuperar la información desde el usuario.
requestPasswordAuthentication: Esta fuente concede permiso para pedir al autentificador registrado con el sistema una password. Conceder este permiso podría significar que código preciado podría robar la password.
specifyStreamHandler: Esta fuente concede permiso para especificar un manejador de stram cuando se construye una URL. Conceder este permiso podría significar que código malicioso podría crear una URLK con recursos a los que normalmente no tendría acceso, o especificar un controlador de stream para obtener los bytes reales desde algun real al que tenga acceso. Esto significa que el código malicios podría embaucar al sistema para crear una clase ProtectionDomain/CodeSource incluso aunque la clase realmente no venga de esa localización.
grant {
permission java.util.PropertyPermission
"java.home", "read";
permission java.util.PropertyPermission
"os.name", "write";
permission java.util.PropertyPermission
"user.name", "read, write";
};
La lista de fuentes contiene el nombre de la propiedad, por ejemplo, java.home o os.name. La convención de nombres para propiedades sigue la convención de nombres hereditarios, e incluye comodines. Un asterisco al final del nombre de propiedad, después de un punto (.), o en solitario, significa un comodin. Por ejemplo, java.* o * son válidos, pero *java o a*b no lo son.
Las acciones se especifican en una listra de palabras claves separadas por comas, que tienen este significado:
grant {
permission java.lang.reflect.ReflectPermission
"suppressAccessChecks";
};
suppressAccessChecks: Esta fuente concede permiso para acceder a los campos e invocar métodos de una clase. Esto incluye campos y métodos públicos, protegidos y privados. Conceder este permiso pidría revelar información confidencial y poner métodos importantes al alcance del código malicioso.
grant {
permission java.lang.RuntimePermission
"createClassLoader";
permission java.lang.RuntimePermission
"getClassLoader";
permission java.lang.RuntimePermission
"exitVM";
permission java.lang.RuntimePermission
"setFactory";
permission java.lang.RuntimePermission
"setIO";
permission java.lang.RuntimePermission
"modifyThread";
permission java.lang.RuntimePermission
"modifyThreadGroup";
permission java.lang.RuntimePermission
"getProtectionDomain";
permission java.lang.RuntimePermission
"setProtectionDomain";
permission java.lang.RuntimePermission
"readFileDescriptor";
permission java.lang.RuntimePermission
"writeFileDescriptor";
permission java.lang.RuntimePermission
"loadLibrary.<library name>";
permission java.lang.RuntimePermission
"accessClassInPackage.<package name>";
permission java.lang.RuntimePermission
"defineClassInPackage.<package name>";
permission java.lang.RuntimePermission
"accessDeclaredMembers.<class name>";
permission java.lang.RuntimePermission
"queuePrintJob";
};
Las convenciones de nombrado para la fuente sigue la convención de nombres hereditarios, e incluye comodines. Un asterisco al final del nombre de propiedad, después de un punto (.), o en solitario, significa un comodin. Por ejemplo, loadLibrary.* o * son válidos, pero *loadLibrary o a*b no lo son.
createClassLoader: Esta fuente concede permiso para crear un cargador de clases. Conceder este permiso podría permitir a una aplicación maliciosa que ejemplarize su propio cargador de clases y carge clases peligrosas en el sistema. Una vez cargado, el cargador de clases podría situar esas clases bajo cualquier dominio proegido dándoles total control sobre ese dominio.
getClassLoader: Esta fuene concede permiso para recuperar el cargador de clases para la clase llamante. Conceder este permiso podría permitir que código malicioso obtuviere el cargador de clases para una clase particular y cargar clases adicionales.
setContextClassLoader: Esta fuente concede permiso para seleccionar el contexto del cargador de clases usado por un thread. El código del sistema y las extensione susan este contexto para buscar recursos que podrían no existir en el cargador de clases del sistema. Conceder este permiso permite cambiar el contexto del cargador de clases usado para un thread particular, incluyendo los threads del sistema. Esto podría causar problemas si el contexto del cargador de clases tiene código malicioso.
setSecurityManager: Esta fuente concede permiso para seleccionar o reemplazar el controlador de seguridad. El controlador de seguridad es una clase que permite a la aplicaciones implementar un policía de seguridad. Conceder este permiso podría permitir al código mailicioso instalar un controlador menos restrictivo, y por lo tanto, evitar los chequeos a los que se forzado el controlador de seguridad original.
createSecurityManager: Esta fuente concede permiso para crear un nuevo controlador de seguridad. Conceder este permiso podría darle al código malicioso acceso a método protegidos qie podrían revelar información sobre otras clases o la pila de ejecución.
exitVM: Esta fuente concede permiso para parar la máquina virtual Java. Conceder este permiso podría permitir que código malicioso a montar un ataque de denegación de servicio forzando automáticamente a que se pare la JVM.
setFactory: Esta fuente concede permiso para seleccioanr una fábrica de socket usada por las clases ServerSocket o Socket, o la fábrica de manejadores de streams usada por la clase URL. Conceder este permiso permite al código seleccionar la implementación actual para la factoría de socket, server socket, stream handler, o Remote Method Invocation (RMI). Un atacante podría seleccionar una implementación que manejara los streams de datos.
setIO: Esta fuente concede permiso para cambiar los valores de los streams System.out, System.in, System.err. Conceder este permiso podría pemritir a un atancante cambiar el System.in para robar la entrada del usuario, o seleccionar System.err a un stream de salida null, lo que podría ocultar cualquier error enviado a System.err.
modifyThread: Esta fuente concede permiso para modicar los threads mediante llamadas a los métodos stop, suspend, resume, setPriority, y setName de la clase Thread. Conceder este permiso podría permitir a un atancante arrancar o suspender cualquier tread e el sistema.
stopThread: Esta fuente concede permiso para parar threads. Conceder este permisos permtie al código que pare cualquier thread en el sistema proporcionando el código que ya tiene permiso para acceder a ese thread, EL código malicioso podría corromper el sistema eliminado threads existentes.
modifyThreadGroup: Esta fuente concede permiso para modificar threads mediante llamadas a los métodos destroy, resume, setDaemon, setmaxPriority, stop, y suspend de la clase ThreadGroup. Conceder este permiso podría permitir al atancante que cree un grupo de threadas y seleccionar su prioridad de ejecución.
getProtectionDomain Esta fuente concede permiso para recuperar el ejemplar ProtectionDomain para una clase. Conceder este permiso pemite al código obtener información de policía para ese código fuente. Mientras que la obtención de la información de policía no compromete la seguridad del sistema, si que le ofrece información adicional al atacante como los nombres de ficheros locales, por ejemplo.
readFileDescriptor: Esta fuente concede permiso para leer descriptores de ficheros. Conceder este permiso permite al código leer el fichero particular asociado con el descriptor de fichero, que es peligroso si el fichero contiene datos confidenciales.
writeFileDescriptor: Esta fuente concede permiso para escribir descriptores de ficheros. Conceder este permiso permite al código escribir el fichero asociado con el descriptor de fichero, lo que es peligroso si el descriptor apunta a un fichero local.
loadLibrary.{library name}: Este fichero concede permiso para enlazar dinámicamente la librería especificada. Conceder este permiso podría ser peligroso porque la arquitectura de seguridad no está diseñada y no se extiende para las clases nativas cargadas mediante el método java.lang.System.loadLibrary.
accessClassInPackage.{package name} Esta fuente concede permiso para acceder al paquete especificado mediante el método loadClass del cargador de la clase cuando el cargador de la clase llama al método SecurityManager.checkPackageAcesss. Conceder este permiso le da al código acceso a las clases de paquetes a los que normalmente no tiene acceso. El código mailicioso podría usar estas clases para ayudarse en su intento de comprometer la seguridad del sistema.
defineClassInPackage.{package name}: Esta fuente concede permiso para definir las clases del paquete especificado mediante un método defineClass del cargador de clases cuando el cargador llama al método SecurityManager.checkPackageDefinition. Conceder este permiso permite al código definir una clase en un paquete particular, lo que podría ser peligroso porque el código malicioso con este permiso podría definir clases peligrosas en paquetes verdaderos como java.security o java.lang, por ejemplo.
accessDeclaredMembers: Esta fuente concede permiso para acceder a miembros declarados de una clase. Conceder este permiso permite al código solicitar una clase por sus campos y métodos públicos, protegidos, por defecto (paquete) y privados. Aunque el código podría tener acceso a los nombres de los campos y métodos privados y protegidos, no podrá acceder a sus datos y no podrá invocar ningún método privado. A pesar de esto, el código malicioso podría usar esta información para mejorar su ataque. Además, el código malicios podría invocar métodos públicos o acceder a campos públicos de la clase, lo que podría ser peligroso.
queuePrintJob: Esta fuente concede permiso para inicializar una petición de trabajo de impresión. Conceder este permiso podría permitir al código qe imprima información sensible en una impresora o que gaste papel maliciosamente.
grant {
permission java.security.SecurityPermission
"getPolicy";
permission java.security.SecurityPermission
"setPolicy";
permission java.security.SecurityPermission
"getProperty.os.name";
permission java.security.SecurityPermission
"setProperty.os.name";
permission java.security.SecurityPermission
"insertProvider.SUN";
permission java.security.SecurityPermission
"removeProvider.SUN";
permission java.security.SecurityPermission
"setSystemScope";
permission java.security.SecurityPermission
"setIdentityPublicKey";
permission java.security.SecurityPermission
"setIdentityInfo";
permission java.security.SecurityPermission
"addIdentityCertificate";
permission java.security.SecurityPermission
"removeIdentityCertificate";
permission java.security.SecurityPermission
"clearProviderProperties.SUN";
permission java.security.SecurityPermission
"putProviderProperty.<provider name>";
permission java.security.SecurityPermission
"removeProviderProperty.SUN";
permission java.security.SecurityPermission
"getSignerPrivateKey";
permission java.security.SecurityPermission
"setSignerKeyPair";
};
getPolicy: Esta fuente concede permiso para recuperar el policía de seguridad del sistema. Conceder estep permiso revela qué permisis seberían concederse a una aplicación o un applet dados. Mientras que la revelación del policía no compromete la seguridad del sistema, proporciona al código malicios información adicional que podría usar para un mejor ataque.
setPolicy: Esta fuente concede permiso para seleccionar el policía de seguridad del sistema. Conceder este permiso podría permitir al código malicioso que se conceda a sí mismo todos los permiso para montar un ataque al sistema.
getProperty.{key}: Esta fuente concede permiso para recuperar la propiedad de seguridad especificada mediante {key}. Dependiendo de la clave particular para el que se concede el acceso, el código podría tener accedo a una lista de proveedores de seguridad y la localización de las policías de seguridad del sistema y de usuario. Mientras que la revelación de esta información no compromete la seguridad del sistema, si proporciona información adicional que podría usar para un mejor ataque.
setProperty.{key}: Esta fuente concede permiso para seleccionar la propiedad de seguridad especificada por {key}. Esto podría incluir la selección de un proveedor de seguridad o definir la localización del policía de seguridad del sistema. El código malicioso podría usar un proveedor maligno que robará información confidencial como las claves privadas. Además, el código malicioso podría seleccionar con los permisos seleccionar la localización del policía de seguridad del sistema que podría apuntar a un policía de seguridad que conceda al atancante todos los permisos necesarios que requiera para montar el ataque al sistema.
insertProvider.{provider name}: Esta fuente concede permiso para añadir un nuevo proveedor de seguridad especificado por {provider name}. Conceder este permiso permite la introducción un proveedor posiblemente malicioso que podría desubrir cosas como las claves provadas que se les pasa. Esto es posible porque el objeto Security, que maneja todos los proveedores instaladore, no cheque realmente la integridad o la autenticidad de un proveedor antes de adjuntarlo.
removeProvider.{provider name}: Esta fuente concede permiso para eliminar un proveedor de seguridad especificado por {provider name}. Conceder este permiso podría cambiar el comportamietno o desactivar la ejecuciónde partes del programa. Si un proveedor solicitado por el programa ha sido eliminado, la ejecución podría fallar.
setSystemScope: Esta fuente concede permiso para seleccionar el ámbito de identidad del sistema. Conceder este permiso podría permitir al atacante configurar el ámbito de seguridad del sistema con certificados que no deberían ser creidos. Esto podría conceder al código firmado cuyos privilegios certificados podrían ser denegados por el ámbito de identidad original.
setIdentityPublicKey: Esta fuente concede permiso para seleccionar la clave pública de un objeto Identity. Si la identidad se marca como trusted, permite al atacante introducir su propia clave pública que no es verdadera mediante el ámbito de identidad del sistema. Esto podría conceder al código firmado privilegios de clave pública que de otra forma serían denegados.
SetIdentityInfo: Esta fuente concede permiso para seleccionar un string de información general para un objeto Identity. Conceder este permiso permite al atancate seleccionar una descripción general para una identidad. Haciéndolo podríamos embaucar a las aplicaciones a usar una identidad diferente que evite a las aplicacioens encontrar una identidas particular.
addIdentityCertificate: Esta fuente concede permiso para añadir un certificado para un objeto Identity. Conceder este permiso permite a los atacantes seleccionar un certificado para una clave pública de identidad haciendo que la clave pública sea verdadera a una audiencia mayor de la original.
removeIdentityCertificate: Esta fuente concede permiso para eliminar un certificado de un objeto Identity. Conceder este permiso permite al atacante eliminar un certificado para la clave pública de una identidad. Esto podría ser peligroso porque una clave pública podría ser considerada como menos verdadera de lo que podría ser.
printIdentity: Esta fuente concede permiso para imprimir el nombre de un prinicpal el ámbito en que se usa el principal, y cuando el principal es considerado como verdadero en este ámbito. El ámbito impreso podría ser un nombre de fichero, en cuyo caso podría robar información del sistema local. Por ejemplo, aquí hay un ejemplo de impresión de un nombre de identidad carol, que está marcado como verdadero en la base de datos de identidad del usario:
clearProviderProperties.{provider name} Esta fuente concede permiso para borrar un objeto Provider para que no contenga más propiedades usadas para buscar servicios implementados por el proveedor. Conceder este permiso desactiva los servicios de búsqueda implementados por el proveedor. Esto podría cambiar el comportamiento o desactivar la ejecuciónde otras partes del programa que normalmente utiliará el Provider, como se describe bajo el permiso removeProvider.{provider name} de arriba.carol[/home/luehe/identitydb.obj][not trusted].
putProviderProperty.{provider name}: Esta fuente concede permiso para seleccionar propiedades del proveedor seleccionado. Cada propiedad del proveedor especifica el nombre y la localización de un servicio particular implementado por el proveedor. Conceder este permiso permite al código reemplazar la especificación de servicio con otro con una diferente implementación y podría ser peligroso si la nueva implementación tiene código malicioso.
removeProviderProperty.{provider name}: Esta fuente concede permiso para eliminar propiedades del proveedor especificado. Conceder este permiso desactiva la búsqueda de servicios implementada por el proveedor haciéndola inaccesible. Conceder este permiso a código malicioso podría permitirle cambiar el comportamiento o desactivar la ejecución de otras partes del programa que normalmente podrían utilizar el objeto Provider, como se describe el permiso bajo removeProvider.{provider name}.
getSignerPrivateKey: Esta fuente concede permiso para recuperar la clave privada de un objeto Signer. Las calves privadas deberían ser siempre secretas. Conceder este permiso podría permtir a código malicioso utilizar la clave privada para firmar ficheros y reclamar que la firma venga del objeto Signer.
setSignerKeyPair: Esta fuente concede permiso para seleccionar la pareja de claves pública y privada para un objeto Signer. Conceder este pemriso podría permitir al atacante reemplazar la pareja de claves con una posible y pequeña pareja de claves. Esto también podría permitir a un atacante escuchar una comunicación encriptada entre la fuente y sus pares. Los pares de la fuente podrían envolver la sesión de encriptación bajo la clave pública new, que podría el atacante (que posee la clave privada correspondiente) para desempaquetar la clave de sesión y desencriptar la comunicación.
grant {
permission java.io.SerializablePermission
"enableSubclassImplementation";
permission java.io.SerializablePermission
"enableSubstitution";
};
enableSubclassImplementation: Esta fuente concede permiso para implementar una subclase de ObjectOutputStream o ObjectInputStream para sobreescribir la serialización o deserialización por defecto de objetos. Conceder este permiso podría permitir al código usar esto para serializar o deserializar clases de una forma maliciosa. Por ejemplo, durante la serialización, el código malicioso podría almacenar campos privados confidenciales de una forma fácilmente accesible para los atacantes; o durante la deserialización el código malicioso podría deserializar una clase con todos sus campos privados puestos a cero.
enableSubstitution: Esta fuente concede permiso para sustituir un objeto por otro durante la serialización deserialización. Conceder este permiso podría permitir a código malicioso reemplazar el objeto real con otro que tenga datos incorrectos o malignos.
Esta entrada de fichero de policía permite que una conexión acepte conexiones al puerto 7777 en el host puffin.eng.sun.com.
grant {
permission java.net.SocketPermission
"puffin.eng.sun.com:7777",
"connect, accept";
};
Esta entrada de fichero de policia permite a la conexión, aceptar conexiones para escuchar cualquier puerto entre el 1024 y el 65535 en el host local.
grant {
permission java.net.SocketPermission
"localhost:1024-",
"accept, connect, listen";
};
El host se expresa con la siguiente sintaxis como un nombre DNS, una dirección IP numérica, o como localhost (para la máquina local). El comodin asterisco (*) se puede incluir una vez en una especificación de nombre DNS. Si se incluye dene estár en la posición más a la izquierda, como en *.sun.com.
El puerto o rango de puertos es opcional. Una especificación de puerto de la forma N-, donde N es un número de puerto, significa todos los puertos numerados N y superiores, mientras que una especificación de la forma -N indica todos los puertos numerados N e inferiores.host = (hostname | IPaddress)[:portrange] portrange = portnumber | -portnumber | portnumber-[portnumber]
La acción listen es sólo importante cuando se usa con el localhost, y resolve (resuelve la dirección del servicio host/ip) cuando cualquiera de las otras opcioones está presente.
Conceder permiso al código para aceptar o crear conexiones sobre host remotos podría ser peligroso porque código malevolente podría más fácilmente transferir y compartir datos confidenciales.
Nota: En plataformas Unix, sólo el raíz tiene permiso para acceder a los puertos inferiores a 1024.