Le ver Morris ne fut pas écrit pour causer des dommages mais pour se propager. Des erreurs dans le code l'ont toutefois rendu plus dangereux : un ordinateur pouvait être infecté plus d'une fois et chaque processus additionnel ralentissait la machine au point de la rendre inutilisable.
Le ver Morris exploitait deux vulnérabilités connues dans sendmail, fingerd, et dans la faiblesse de mots de passe de certains utilisateurs. La faille de sendmail se situait dans la possibilité, en mode 'DEBUG', d'envoyer des fichiers sur une machine distante en utilisant un shell. Ce shell était utilisé pour compiler le code source envoyé. Ce programme une fois compilé était alors en mesure de tenter de se propager à d'autres machines. La deuxième faille utilisée était un dépassement de tampon de l'utilitaire finger initialement conçu pour connaitre à distance l'heure de connexion d'un utilisateur sur un poste. Ce bug permettait au ver de prendre le contrôle et d'utiliser les accès réseau de l'utilitaire pour se connecter à des machines distantes, et d'y migrer comme avec sendmail. Enfin, la troisième technique de propagation profitait des mots de passe faibles des utilisateurs des systèmes infectés : le ver tentait de deviner les mots de passe des utilisateurs à l'aide de dictionnaires, et lorsqu'il trouvait le bon, se copiait sur des machines distantes avec les commandes [rsh](/fr/definitions/rsh)[type=embedded-definition] et rexec.
Lorsque le ver parvenait à une nouvelle machine, il se divisait, effaçait les fichiers qui le contenaient pour ne laisser aucune trace, et une fois sur quinze, envoyait un octet à la machine 128.32.137.13 (ernie.berkeley.edu) de l'université de Berkeley, comme message de bon fonctionnement, ou pour détourner les soupçons.
Même s'il ne pouvait infecter que des machines VAX exécutant les systèmes 4 BSD et Sun 3, le ver Morris s'est propagé à une vitesse qui ne semblait pas avoir été prévue par son auteur. La charge processeur qu'il nécessitait a alors provoqué des dénis de service, que ce soit en termes de performance, et même d'accès (le nombre de processus du ver sur une machine empêchait tout nouveau processus, donc toute connexion d'un utilisateur).